Лучший способ сжимать XML

Мне нужно сжать очень большой XML файл до наименьшего возможного размера.

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

Спасибо!

Ответ 1

Возможно, это не самый маленький размер, но вы можете использовать System.IO.Compression для сжатия. Zipping имеет тенденцию обеспечивать очень хорошее сжатие для текста.

using (var fileStream = File.OpenWrite(...))
using (var zipStream = new GZipStream(fileStream, CompressionMode.Compress))
{
    zipStream.Write(...);
}

Ответ 2

Как указано выше, Efficient XML Interchange (EXI) обеспечивает наилучшее доступное сжатие XML довольно последовательно. Даже без схем это не редкость для EXI в 2-5 раз меньше, чем zip. Со схемами вы сделаете еще лучше.

Если вы не против коммерческой реализации, вы можете использовать .NET-версию Efficient XML и вызывать ее прямо из вашего кода на С#, используя стандартные .NET API. Вы можете скачать бесплатную пробную копию из http://www.agiledelta.com/efx_download.html.

Ответ 3

Если у вас есть схема, доступная для XML файла, вы можете попробовать EXIficient. Это реализация формата Efficient XML Interchange (EXI), который является в значительной степени лучшим доступным методом сжатия XML общего назначения. Если у вас нет схемы, EXI по-прежнему лучше обычного zip (алгоритм дефляции, то есть), но не очень, особенно для больших файлов.

EXIficient - это только Java, но вы, вероятно, можете превратить его в приложение, которое вы можете вызвать. Я не знаю каких-либо open-source реализаций EXI в С#.

Ответ 5

Размер файла не является единственным преимуществом EXI (или любой бинарной схемы). Время обработки и накладные расходы памяти также значительно уменьшаются при чтении/записи. Представьте себе программу, которая копирует числа с плавающей запятой на диск, просто копируя байты. Теперь представьте себе, что другая программа преобразует числа с плавающей точкой в ​​форматированный текст и вставляет их в текстовый поток, а затем передает этот поток через дорогостоящий алгоритм сжатия. Из-за этих смешных накладных расходов XML в основном неприменим для очень больших файлов, которые можно было легко обработать с помощью двоичного представления.

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

Ответ 6

XML сильно сжимается. Вы можете использовать DotNetZip для создания сжатых zip файлов из XML.

Ответ 7

если вам нужен максимальный уровень сжатия, я бы порекомендовал LZMA. Существует SDK (включая С#), который является частью проекта с открытым исходным кодом 7-Zip, доступный здесь.

Ответ 8

Если вы ищете наименьший возможный размер, попробуйте Fast Infoset в качестве двоичного кодирования XML, а затем сжимайте с помощью BZIP2 или LZMA. Вероятно, вы получите лучшие результаты, чем сжатие текста XML или использование EXI. FastInfoset.NET включает в себя реализацию стандарта Fast Infoset и нескольких форматов сжатия, которые можно выбрать, но коммерческие.