0

Мое приложение нужно хранить большое количество XML-иерархическую информацию со следующими требованиями:Хранение XML документов в предварительно разобран двоичном формате

  1. Быстро читать
  2. Минимальное потребление памяти
  3. типизированных данных вместо простого текста

Любые предложения по двоичному формату, который выполняет эти цели?

+0

Действительно ли хранилище должно быть двоичным или вы говорите, что, поскольку вы считаете, что двоичный код «явно» более эффективен? XML, хранящийся в виде заархивированных данных, может быть более эффективным, чем многие двоичные форматы (например, стандартная сериализованная Java). – SteveD

+0

Это довольно утверждение ... оно может быть меньше, но я очень сомневаюсь, что это будет быстрее. – skaffman

+0

@Skaffman Ваш комментарий относится к вопросу или предыдущему комментарию? – KLE

ответ

1

Вы не указываете, является ли xml требование к формату, вы только говорите, что оно должно быть иерархическим, как xml.

Без дополнительной информации о типах данных сложно дать вам советы. Итак, вот небольшой список.

  • b-деревья Есть несколько библиотек, поддерживающих форматы хранения b-дерева в многоязычных языках. они имеют быстрый поиск и являются иерархическими по своей природе.
  • Протокол-буферы из Google. Компактное хранилище, оптимизированное для отправки по кабелю. Однако не обязательно оптимизирован как формат хранения. Они напечатаны и, вероятно, будут очень хорошо выглядеть как формат хранения.
  • Форматы текстового редактора. компактный, и в зависимости от формата, выбранного типичным и иерархическим по своей природе.
    • YAML (с поддержкой для некоторых сложного набора текста, иерархического, человек читаемого)
    • JSON (меньше поддержки типирование, быстрый разборе, иерархического, читаемого)
1

Нужно ли другим приложениям читать сохраненные данные или только ваши данные? Нужно ли быть «стандартным» форматом?

Fast Infoset удовлетворяет требованиям (1) и (2), хотя, поскольку это всего лишь двоичное представление XML-модели данных, оно также не типично, как XML. Возможно, это будет достаточно хорошо для ваших целей, хотя в отсутствии чего-либо еще.

1

В ваших требованиях слишком мало деталей, чтобы давать хорошие предложения. Например, вы можете выбрать свой носитель? Будет ли это файловая система, база данных или что-то еще?

Что означает «минимальное потребление памяти»? Вы работаете на ограниченной платформе? Должны ли вы делиться ресурсами с другими приложениями? Является ли размер 1 ГБ достаточно маленьким, если на вашем компьютере 4 ГБ памяти? Будут ли данные храниться в памяти или только те части, над которыми вы работаете?

Если платформа была Java, я бы начал с ее стандартной сериализации, а затем исследовал пользовательскую сериализацию, если меня не устраивает производительность.

1

Если формат обсуждается, я бы предложил JSON, а не XML. JSON на самом деле быстрее загружает и пишет, чем стандартный XML.

Подробнее о формате JSON:

http://www.25hoursaday.com/weblog/PermaLink.aspx?guid=060ca7c3-b03f-41aa-937b-c8cba5b7f986 http://www.25hoursaday.com/weblog/PermaLink.aspx?guid=39842a17-781a-45c8-ade5-58286909226b

+0

Во-первых, JSON не является заменой XML, он не может представлять структуры той же сложности. Во-вторых, это довольно показатель производительности, который я хотел бы увидеть подкрепленным доказательствами. – skaffman

+0

Id 'хотел бы узнать больше о «структурах с такой же сложностью», с которыми JSOn тоже не справляется. – yoda

+0

XML-атрибуты, например, пространства имен XML для другого. JSON - это просто карта с вложенным ключом. – skaffman

1

Вы также можете прочитать XML в граф объектов и хранить как Google протокола буферы. Они разработаны, чтобы быть очень эффективными.

1

объяснения Википедии выпуска: http://en.wikipedia.org/wiki/Binary_XML

Предположительно рекомендуется организация и ее Java и .NET SDK можно скачать с: http://www.agiledelta.com/product_efx.html

xml - чистый текст, но может использоваться для представления сериализованных объектов. Предположим, что ваш сериализатор сериализует ваши объекты в xml.

Вам не следует пытаться преобразовывать объекты в двоичные потоки, потому что вам придется решать проблему endian (http://en.wikipedia.org/wiki/Endian) и проблемы с представлением данных. Однако, если вы настаиваете, вам понадобится использовать XDR (http://en.wikipedia.org/wiki/External_Data_Representation) для нейтральности своей архитектуры данных.

В противном случае вы должны сериализовать свои объекты в XML с помощью стандартных сериализаторов, а затем преобразовать xml в двоичный/компактный xml из-за доступности библиотек и sdks. И затем десериализуем путем декомпозиции из двоичного xml.