Лучший алгоритм сжатия для XML?

Я почти ничего не знаю о сжатии, так что терпите меня (это, вероятно, глупый и болезненно очевидный вопрос).

Допустим, у меня есть XML-файл с несколькими тегами.

<verylongtagnumberone>
  <verylongtagnumbertwo>
    text
  </verylongtagnumbertwo>
</verylongtagnumberone>

Теперь допустим, что у меня есть несколько этих очень длинных тегов со многими атрибутами в моих нескольких XML-файлах. Мне нужно сжать их до минимально возможного размера. Лучшим способом было бы использовать специфичный для XML алгоритм, который назначает отдельные теги псевдонимами, такими как vlt1 или vlt2. Тем не менее, это не будет таким "открытым" способом, как я пытаюсь пойти, и я хочу использовать общий алгоритм, такой как DEFLATE или LZ. Также помогает, если архив был.zip-файлом.

Поскольку я имею дело с обычным текстом (без двоичных файлов, таких как изображения), я бы хотел алгоритм, который подходит для простого текста. Какой из них дает наименьший размер файла (предпочтительны алгоритмы без потерь)?

Кстати, сценарий таков: я создаю стандарт для документов, таких как ODF или MS Office XML, которые содержат файлы XML, упакованные в ZIP-архив.

РЕДАКТИРОВАТЬ: вещь шифрования была опечатка; это должно иметь бен "сжатие".

8 ответов

Решение

Существует стандарт W3 (еще не выпущенный) под названием EXI (эффективный обмен XML).

Должен стать форматом данных для сжатия XML-данных в будущем (заявлен как последний необходимый двоичный формат). Будучи оптимизированным для XML, он сжимает XML более эффективно, чем любой обычный алгоритм сжатия.

С EXI вы можете работать со сжатыми данными XML на лету (без необходимости распаковывать или повторно сжимать их).

EXI = (XML + XMLSchema) как двоичный файл.

И здесь вы идете с реализацией с открытым исходным кодом (не знаю, если она уже стабильна):
Exificient

Да, *.zip лучший на практике. Gory deets, содержащийся в этой статье USENIX, показывает, что "оптимальные" компрессоры не стоят вычислительных затрат, а специфичные для области компрессоры не превосходят zip [в среднем].

Отказ от ответственности: я написал ту статью, которая была процитирована более 60 раз в соответствии с Google.

Другой альтернативой "сжатию" XML будет FI (Fast Infoset).

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

Увидеть:

Очень хорошая статья на java.sun.com и, конечно,
запись в Википедии

Отличие от EXI с точки зрения сжатия состоит в том, что Fast Infoset (будучи структурированным открытым текстом) менее эффективен.

Другое важное отличие: FI является зрелым стандартом со многими реализациями.
Один из них: Fast Infoset Project @ dev.java.net

Похоже, вы больше заинтересованы в сжатии, чем в шифровании. Это тот случай? Если это так, это может оказаться интересным, хотя и не является точным решением.

Кстати, сценарий таков: я создаю стандарт для документов, таких как ODF или MS Office XML, которые содержат файлы XML, упакованные в ZIP- архив.

тогда я бы посоветовал вам использовать сжатие.zip, иначе ваши пользователи запутаются.

Ваши альтернативы:

  • Используйте веб-сервер, который поддерживает сжатие GZIP. Это будет автоматически сжимать все исходящие HTML. Есть небольшой штраф процессора.
  • Используйте что-то вроде JSON. Это резко уменьшит размер сообщения
  • Есть также двоичный XML, но я сам не пробовал.

Надеюсь, я правильно понял, что вам нужно сделать... Первое, что я хотел бы сказать, это то, что нет хороших или плохих алгоритмов сжатия для текста - zip, bzip, gzip, rar, 7zip достаточно хороши для сжатия всего, что имеет низкая энтропия - т.е. большой файл с небольшим набором символов. Если бы мне пришлось их использовать, я бы выбрал 7zip по своему выбору, rar как второй и zip как третий. Но разница очень мала, поэтому вы должны попробовать все, что проще для вас. Второе - я не мог понять, что вы пытаетесь зашифровать. Предположим, что это XML-файл, затем вы должны сначала сжать его, используя свой любимый алгоритм сжатия, а затем зашифровать его, используя свой любимый алгоритм шифрования. В большинстве случаев любой современный алгоритм, реализованный, например, в PGP, будет достаточно безопасным для чего угодно. Надеюсь, это поможет.

Ни один из значений по умолчанию не идеален для XML, но вы все равно получите хорошие значения, так как существует много повторяемых значений.

Поскольку XML использует много повторов (тегов. >), Вы хотите, чтобы они были меньше, чем бит, поэтому некоторая форма арифметики, а не кодирования Хаффмана. Так что теоретически rar / 7zip должен быть значительно лучше.. эти алгоритмы обеспечивают высокую степень сжатия, поэтому работают медленнее. В идеале вам нужно простое сжатие с арифметическим кодировщиком (который для XML будет быстрым и даст высокое сжатие) .

Другие вопросы по тегам