2010-01-06 757 views
11

Necesito comprimir un archivo xml muy grande al tamaño más pequeño posible.La mejor manera de comprimir XML

Trabajo en C#, y prefiero que sea una fuente abierta o una aplicación a la que pueda acceder a través de mi código, pero también puedo manejar un algoritmo.

¡Gracias!

+1

Me gustaría probar Zlib. Pero puede haber conversores de XML a binarios basados ​​en esquemas. –

Respuesta

1

XML es muy compresible. Puede usar DotNetZip para producir archivos zip comprimidos desde su XML.

+0

@Downvoter - ¿me gustaría comentar? – Oded

10

Puede que no sea el "tamaño más pequeño posible", pero se puede usar utilización System.IO.Compression para comprimirlo. Zipping tiende a proporcionar una muy buena compresión para el texto.

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

si necesita un nivel de compresión máximo, recomendaría LZMA. Hay un SDK (incluido C#) que es parte del proyecto de código abierto 7-Zip, disponible here.

+0

Puede hacer mucho mejor con algoritmos de compresión específicos de XML. – vy32

3

Si tiene un esquema disponible para el archivo XML, puede probar EXIficient. Es una implementación del formato Efficient XML Interchange (EXI) que es prácticamente el mejor método de compresión XML de propósito general disponible. Si no tiene un esquema, EXI es mejor que el archivo zip normal (el algoritmo de desinflado, eso es), pero no mucho, especialmente para archivos de gran tamaño.

EXIficient es solo Java, pero probablemente puedas convertirlo en una aplicación a la que puedas llamar. No conozco ninguna implementación de código abierto de EXI en C#.

6

Como se indicó anteriormente, Efficient XML Interchange (EXI) logra la mejor compresión XML disponible de forma bastante consistente. Incluso sin esquemas, no es raro que EXI sea 2-5 veces más pequeño que zip. Con los esquemas, lo harás aún mejor.

Si no se opone a una implementación comercial, puede utilizar la versión .NET de Efficient XML y llamarlo directamente desde su código C# utilizando las API .NET estándar. Puede descargar una copia de prueba gratuita en http://www.agiledelta.com/efx_download.html.

2

El tamaño del archivo no es la única ventaja de EXI (o de cualquier esquema binario). El tiempo de procesamiento y la sobrecarga de memoria también se reducen considerablemente al leerlo/escribirlo. Imagine un programa que copia números de punto flotante en el disco simplemente copiando los bytes. Ahora imagina que otro programa convierte los números de coma flotante a texto formateado y los pega en una secuencia de texto y luego los alimenta a través de un costoso algoritmo de compresión. Debido a esta ridícula sobrecarga, XML es básicamente inutilizable para archivos muy grandes que podrían haberse procesado sin esfuerzo con una representación binaria.

El XML binario promete solucionar esta debilidad de XML. Sería muy fácil crear una utilidad que convierta entre representaciones binarias/de texto (sin conocer el esquema XML), lo que significa que aún puede editar los archivos fácilmente cuando lo desee.

1

Si está buscando el tamaño más pequeño posible, intente Fast Infoset como codificación XML binaria y luego comprima con BZIP2 o LZMA. Probablemente obtendrá mejores resultados que comprimir texto XML o usar EXI. FastInfoset.NET incluye implementaciones del estándar Fast Infoset y varios formatos de compresión para elegir, pero es comercial.

Cuestiones relacionadas