2010-10-05 17 views
8

Estoy tratando de usar flujos desinflados/gzip en C#, pero parece que los archivos después de la compresión son más grandes que antes.GZipStream y DeflateStream producen archivos más grandes

Por ejemplo, comprime un archivo docx de 900ko, pero produce un 1.4Mo uno.

Y lo hace por cada archivo que probé.

¿Puedo estar equivocado en la forma en que lo estoy haciendo? Aquí está mi código:

FileStream input = File.OpenRead(Environment.CurrentDirectory + "/file.docx"); 
    FileStream output = File.OpenWrite(Environment.CurrentDirectory + "/compressedfile.dat"); 

    GZipStream comp = new GZipStream(output, CompressionMode.Compress); 

    while (input.Position != input.Length) 
     comp.WriteByte((byte)input.ReadByte()); 

    input.Close(); 

    comp.Close(); // automatically call flush at closing 
    output.Close(); 
+1

¿Se da cuenta de que un método de compresión que se comprima * cualquier arbitraria * Entrada por al menos un byte no puede existir? Entonces, especialmente si está tratando de comprimir datos que ya están cerca del azar, p. datos precomprimidos, puede ver un aumento de tamaño. – Joey

+3

.docx ya está comprimido usando compresión ZIP (intente cambiar el nombre a .zip y tener una exploración). Me sorprendería si un segundo nivel de compresión produjera algún beneficio. – spender

+0

debería efectivamente hacer compresión solo en el color, por lo que no debería cambiar nada – kite

Respuesta

7

una diferencia tan grande me parece extraño, pero se debe tener en cuenta que docx está a su vez comprimido en ZIP, por lo que no hay ninguna razón para comprimir de nuevo, los resultados generalmente son más grandes.

+0

Confirmado: http://www.myformatfactory.com/DOCX –

+0

sí, gracias, no lo sabía, y es por eso que no funcionó :) intenté con .txt y otro formato y parece mejor. pero todavía no funciona en un tipo de archivo serializado hecho en casa ... pero al final no importa, solo quería ver cómo usar esas transmisiones de compresión :) – kite

-2

No creo que GzipStream y DeflateStream estén destinados a comprimir archivos. Probablemente tengas mejor suerte con un compresor de archivos como SharpZipLib.

+0

están hechas para comprimir y descomprimir. Actualmente estoy leyendo el libro de certificación MCTS 70-536 y se usan así ^^ – kite

+0

y para qué sirven? http://msdn.microsoft.com/en-us/library/system.io.compression.gzipstream.aspx "Clase GZipStream Proporciona métodos y propiedades utilizados para comprimir y descomprimir transmisiones". – Andrey

+0

Son perfectamente buenos para comprimir archivos y, en muchos casos, son más prácticos que zip, ya que trabajan directamente en el archivo en lugar de crear un archivo, y puedes enviarlos directamente desde un servidor web en lugar de comprimir sobre la marcha todo el tiempo. Agregar .gz al nombre (después de la extensión original en lugar de reemplazarlo) es común con los archivos gzip. Sin embargo, SharpZipLib no es mejor en muchos casos. –

2

En primer lugar, desinflar/corrientes GZIP son notablemente mala en compresión cuando se compara con zip, 7z, etc.

En segundo lugar, docx (y todos los formatos de documento de MS con una 'x' al final) son sólo .zip archivos de todos modos. Cambie el nombre de un .docx a .zip para revelar el humo y los espejos.

Así que cuando ejecutas deflate/gzip sobre un docx, en realidad aumentará el tamaño del archivo. (Es como hacer un zip con un bajo nivel de compresión sobre un archivo comprimido con un alto nivel de compresión.)

Sin embargo, si ejecuta desinflar/gzip sobre HTML o un archivo de texto o algo que no está comprimido, lo hará en realidad hago un trabajo bastante bueno.

+0

sí, gracias, como dije en otro comentario, no sabía que docx ya estaba comprimido. y seguro 7z y otras bibliotecas son mejores, pero solo quería probar esto para ver lo que fueron capaces de hacer – kite

+2

Esto parece un comentario totalmente inválido: * las transmisiones desinflar/gzip son notablemente malas en compresión cuando se comparan con zip, 7z, etc *. El hecho es que el 99% de los archivos zip usan DEFLATE como formato de compresión. Así que zip puede ser * no mejor * que DEFLATE, porque aumenta la secuencia comprimida con metadatos. – Cheeso

+0

El fenómeno en el que un DeflateStream realmente * aumenta * el tamaño de los datos previamente comprimidos es el tema de un error que se abrió con Microsoft en 2006: https://connect.microsoft.com/VisualStudio/feedback/details/93930/ gzipstream-deflatestream-fail-to-check-for-incompressible-data – Cheeso

0

Si bien es cierto, como otros han señalado, que el ejemplo que ha especificado ya comprimir los archivos - el mayor problema es entender que a diferencia de la mayoría de las utilidades de compresión, la DeflateStream y GZipStream clases simplemente tratan de tokenize/Comprimir una secuencia de datos sin la inteligencia de que todos los tokens adicionales (sobrecarga) en realidad están aumentando la cantidad de datos requeridos. Zip, 7z, etc. son lo suficientemente inteligentes como para saber que si los datos son en gran parte de entropía aleatoria (prácticamente no comprimibles), simplemente almacenan los datos "tal como están" (almacenar, no comprimidos), en lugar de intentar comprimirlos aún más.

+1

Esto no es cierto: * Zip, 7z, etc. son lo suficientemente inteligentes como para saber que si los datos son en gran parte de entropía aleatoria (prácticamente no comprimibles), simplemente almacenan el datos "tal como están" (almacenar, no comprimidos), en lugar de intentar comprimirlos más. * ZIP es simplemente un formato de archivo. No "sabe" nada. un programa que produce un archivo ZIP puede hacer lo que usted describe, pero el formato ZIP no lo hace. – Cheeso

+1

El fenómeno en el que DeflateStream realmente * infla * el tamaño de los datos previamente comprimidos es el tema de un error que se ha abierto con Microsoft: https://connect.microsoft.com/VisualStudio/feedback/details/93930/gzipstream-deflatestream -fail-to-check-for-incompressible-data – Cheeso

+0

No estaba hablando del formato (buena pena). Estaba hablando de las utilidades de compresión que escriben datos en sus formatos correspondientes. – Michael

0

Tuve el mismo problema con la compresión de bases de datos que contienen datos jpg. Probé dotnetzip - una gota en el reemplazo y me compresión decente (Compatible con .NET Compact también!):

MS : 10MB -> 10.0MB 
DNZ: 10MB -> 7.6MB 
Cuestiones relacionadas