Подтвердить что ты не робот

Версия для дружественного, расширяемого двоичного файла

В проекте, над которым я сейчас работаю, необходимо сохранить значительную структуру данных на диск (отредактируйте: подумайте о десятках MB). Будучи оптимистом, я думал, что для такой проблемы должно быть стандартное решение; однако до сих пор я не нашел решения, удовлетворяющего следующим требованиям:

  • Поддержка .NET 2.0, предпочтительно с реализацией FOSS
  • Версия дружественная (это должно интерпретироваться как: чтение старой версии формата должно быть относительно простым, если изменения в базовой структуре данных просты, скажем, добавление/удаление полей)
  • Возможность делать некоторую форму произвольного доступа, когда часть данных может быть расширена после первоначального создания без необходимости десериализации коллекции, созданной до этого момента (подумайте об этом как о промежуточных результатах).
  • Эффективность пространства и времени (XML был исключен как опция с учетом этого требования)

Варианты, рассмотренные до сих пор:

  • XmlSerializer: было отклонено, поскольку сериализация XML не соответствует требованиям 3 и 4.
  • SerializableAttribute: не поддерживает требования 2 и 3.
  • Буферы протокола: был отклонен приговором документации о Large Data Sets - поскольку этот комментарий предложил добавить еще один слой сверху, это вызовет дополнительную сложность, которую я хочу обработать самим форматом файла.
  • HDF5, EXI: do похоже, нет .net-реализации.
  • SQLite/SQL Server Compact edition: структура данных под рукой приведет к довольно сложной структуре таблицы, которая кажется слишком тяжелой для предполагаемого использования.
  • BSON: не поддерживает требование 3.
  • Fast Infoset: только, кажется, заплатили .NET-реализации.

Приветствуются любые рекомендации или указатели. Кроме того, если вы считаете, что какая-либо из приведенных выше сведений неверна, предоставьте указатели/примеры, чтобы доказать, что я не прав.

4b9b3361

Ответ 1

Рассматривали ли вы использование SQL Server Compact Edition?

  • У этого есть много поддержки .NET.
  • Вершина схемы и возможность для новых версий приложения, обрабатывающих старые схемы, будут полностью контролироваться. Версии SQL Server Compact должны быть несколько безразличными вне вашего приложения, используя функции более новой версии, которых не было в старой версии.
  • У вас есть синтаксис SQL, доступный для запросов.
  • Очевидно, что из этой версии эта версия SQL Server была разработана для встроенных систем, которые могут включать приложения, которые хотят избежать установки SQL Express или полномасштабной версии SQL Server.

Теперь у этого были бы те же проблемы, что и SQLite, поскольку структура данных, из того, что вы нам сказали, могла усложниться, но это будет верно, даже если вы откатите свой собственный двоичный формат.

Btw, мне приходит в голову, что вы не уточнили, что именно подразумевается под "значительным". Если значение "значимый" означает приблизительное или более 4 ГБ, очевидно, что SQL Compact не будет работать и не будет содержать множество других форматов файлов базы данных.

РЕДАКТИРОВАТЬ. Я заметил, что вы добавили SQL Compact Edition в свой список "слишком тяжелый" список после моего сообщения. SQL Compact требует только 5 МБ ОЗУ и 2 МБ дискового хранилища в зависимости от размера базы данных. Таким образом, проблема не может быть тяжелой. Теперь, что касается второй точки зрения, что структура данных будет довольно сложной. Если это правда, я подозреваю, что это будет справедливо для любого продукта реляционной базы данных, и продвижение вашего собственного двоичного формата будет еще более сложным. Учитывая это, вы можете посмотреть на нереляционные продукты базы данных, такие как mongodb.

Ответ 2

Вы считаете (B) JSON? Если это так, одна из документированных баз данных может соответствовать вашим потребностям. CouchDB - это хранилище документов JSON с API REST (определенно доступным из .Net). Документы CouchDB могут иметь двоичные вложения, и я разговаривал с людьми, у которых вложения в нескольких МБ в документах без проблем. Я полагаю, что MongoDB, альтернативная база данных документов, которая использует двоичный JSON в качестве формата хранения, также имеет привязки .Net.

Эти альтернативы "NoSQL" легко версируются, поскольку они, по сути, не содержат схем. JSON довольно компактен и, безусловно, позволяет обновлять существующие данные.

Ответ 3

Вы считали что-то вроде db4o? Лицензирование может ограничить вас, но, похоже, оно будет соответствовать законопроекту.

Ответ 4

Вот интересный вариант: ETCH от Cisco, доступный под лицензией Apache (вы не платите роялти, а ваше программное обеспечение остается коммерческим и вашим.)

Идея заключается в использовании Etch для связи между компонентами вашей системы в двоичной форме. Формат является устойчивым к изменениям в версии и может обрабатывать недостающие поля и т.д., Поскольку состояние ваших требований.

Преимущество состоит в том, что вы получаете более полную систему перевода, поверх бинарного формата. Это считается очень быстрым (машина, выполняющая 900 транзакций SOAP XML в секунду, совершила 50 000 транзакций ETCH).

Вы можете сохранить форму бинаризации в облегченной РСУБД, если вам нужно несколько индексов. Если достаточно одного индекса, то простое хранилище ключей/значений (CouchDB/MongoDB или даже Cassandra для распределенных сред) также даст вам замечательную производительность хранилища!

Ответ 5

Вы рассматривали двоичную сериализацию?

Подробнее см. мой пост здесь. В нем есть пример кода для сериализации пользовательского класса, содержащегося в объекте Dictionary. Не уверен, насколько сложна ваша структура, но она должна быть довольно простой, чтобы адаптировать ее к вашим потребностям.

Добавьте комментарий, если вам нужна дополнительная помощь...

Ответ 6

Если XML не удовлетворяет требованиям из-за использования пространства, вы можете подать XML через System.IO.Compression.DeflateStream, чтобы уменьшить его размер. Алгоритм Deflate по существу совпадает с GZip сжатием, но может быть на 40% быстрее (см. блог Джеффа Атвуда).

Ответ 7

Я бы не стал так быстро списывать протокольные буферы. Конечно, в ручном вводе, на котором вы ссылаетесь, говорится о порядке мегабайта, и вы имеете дело с десятками мегабайт... но попробовали ли вы исследование, чтобы увидеть, влияет ли это ограничение на вас?

Если это все равно повлияет на вас, мое предложение состоит в том, чтобы перейти с гибридным подходом: срез и кости, данные которых установлены в куски размера 1 МБ, а затем хранить каждый кусок как поле таблицы SQLite (как двоичный код), Добавьте в таблицу другие поля для элементов, которые вы хотите индексировать (или выполнить поиск).

Да, это добавляет сложности, но ничто другое, кажется, не приближает вас к тому, куда вам нужно идти.