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

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

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

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

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

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

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

РЕДАКТИРОВАТЬ: «Шифрование» было опечаткой; он должен быть «сжатым».


person Aethex    schedule 04.07.2009    source источник
comment
Как это связано с шифрованием? И простой ответ - позволить ZIP выполнять сжатие: он широко доступен, неплохо справляется с текстами, и не стоит тратить время на поиск наименьшего возможного размера.   -  person kdgregory    schedule 04.07.2009
comment
Почему бы просто не использовать OpenXML? Это в основном то, что вы хотите :). Не уверен, что это лучшее сжатие, но пока оно мне нравится. И если вы этого еще не знаете, OpenXML - это, по сути, zip-файл, поэтому вы можете переименовать свои документы Office 2007 как файл .zip (т.е. something.docx в something.zip) и открыть его как zip-файл. Внутри в основном куча XML.   -  person Jimmy Chandra    schedule 04.07.2009
comment
Вы можете просто использовать кучу XML-файлов в zip-архиве с любым расширением файла, которое хотите. Почему очень длинные номера ???   -  person Osama Al-Maadeed    schedule 05.07.2009
comment
«аве» и «бен» - это опечатки. «шифрование» вместо «сжатие» является ошибкой.   -  person MrFox    schedule 10.12.2015


Ответы (8)


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

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

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

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

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

person ivan_ivanovich_ivanoff    schedule 05.07.2009
comment
Ух ... XML был разработан, потому что двоичные файлы - это зло. И теперь у нас есть вещи EXI. Этот доказательный XML просто изобретал колесо. Разве мы не должны были использовать ASN.1? - person J-16 SDiZ; 05.07.2009
comment
Какой-то нестандартный (или что-то в этом роде) ASN.1 был кандидатом на EXI. Двоичные файлы являются злом. В общем смысле EXI не является двоичным файлом. Вам не нужно писать собственную реализацию для чтения / записи этого двоичного файла, а также определять собственную структуру и систему типов. Все сделано за вас с помощью XML + XmlSchema. - person ivan_ivanovich_ivanoff; 05.07.2009

Да, лучше всего использовать * .zip. Кровавые подробности содержатся в этом документе USENIX < / strong> показывает, что "оптимальные" компрессоры не стоят вычислительных затрат, а компрессоры для конкретных областей не превосходят zip [в среднем].

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

person DotDotJames    schedule 02.04.2014

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

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

Видеть:

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

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

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

person ivan_ivanovich_ivanoff    schedule 06.07.2009
comment
Мы, вероятно, должны упомянуть, что причина, по которой EXI победил FI, заключается в том, что, когда есть схема, она может содержать теги и атрибуты НУЛЬ раз вместо одного раза. - person Steven Sudit; 12.03.2011

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

person Mizipzor    schedule 04.07.2009
comment
старая ссылка кажется мертвой; новая ссылка, любезно предоставлена ​​archive.org и Google: gnosis.cx/publish/programming/xml_matters_13.html - person unbob; 01.09.2019

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

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

person Pete Kirkham    schedule 05.07.2009
comment
Да, плюс сжатие XML не приведет к дальнейшему сжатию. - person Steven Sudit; 12.03.2011

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

  • Используйте веб-сервер, поддерживающий сжатие gzip. Он автоматически сжимает весь исходящий HTML. Тем не менее, есть небольшая потеря процессора.
  • Используйте что-то вроде JSON. Это значительно уменьшит размер сообщения.
  • Также есть двоичный XML, но я сам его не пробовал.
person Zepplock    schedule 04.07.2009
comment
JSON на самом деле не меньше xml, хотя - person Brady Moritz; 17.05.2016

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

person Community    schedule 04.07.2009
comment
Подпись в ответе! Это ново;) - person ivan_ivanovich_ivanoff; 05.07.2009

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

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

person user1496062    schedule 29.04.2016