linux – ¿Por qué Zip puede comprimir un solo archivo más pequeño que varios archivos con el mismo contenido?

Pregunta:

Suponga que tengo 10,000 archivos XML. Ahora suponga que quiero enviárselos a un amigo. Antes de enviarlos, me gustaría comprimirlos.

Método 1: no los comprimas

Resultados:

Resulting Size: 62 MB
Percent of initial size: 100%

Método 2: comprima cada archivo y envíele 10,000 archivos xml

Mando:

for x in $(ls -1) ;  do   echo $x ; zip "$x.zip" $x ; done

Resultados:

Resulting Size: 13 MB
Percent of initial size: 20%

Método 3: cree un único zip que contenga 10,000 archivos xml

Mando:

zip all.zip $(ls -1)

Resultados:

Resulting Size: 12 MB
Percent of initial size: 19%

Método 4: concatenar los archivos en un solo archivo y comprimirlo

Mando:

cat *.xml > oneFile.txt ; zip oneFile.zip oneFile.txt

Resultados:

Resulting Size: 2 MB
Percent of initial size: 3%

Preguntas:

  • ¿Por qué obtengo resultados tan dramáticamente mejores cuando estoy comprimiendo un solo archivo?
  • Esperaba obtener resultados drásticamente mejores con el método 3 que con el método 2, pero no lo haga. ¿Por qué?
  • ¿Este comportamiento es específico de zip ? Si intentara usar gzip , ¿obtendría resultados diferentes?

Información adicional:

$ zip --version
Copyright (c) 1990-2008 Info-ZIP - Type 'zip "-L"' for software license.
This is Zip 3.0 (July 5th 2008), by Info-ZIP.
Currently maintained by E. Gordon.  Please send bug reports to
the authors using the web page at www.info-zip.org; see README for details.

Latest sources and executables are at ftp://ftp.info-zip.org/pub/infozip,
as of above date; see http://www.info-zip.org/ for other sites.

Compiled with gcc 4.4.4 20100525 (Red Hat 4.4.4-5) for Unix (Linux ELF) on Nov 11 2010.

Zip special compilation options:
    USE_EF_UT_TIME       (store Universal Time)
    SYMLINK_SUPPORT      (symbolic links supported)
    LARGE_FILE_SUPPORT   (can read and write large files on file system)
    ZIP64_SUPPORT        (use Zip64 to store large files in archives)
    UNICODE_SUPPORT      (store and read UTF-8 Unicode paths)
    STORE_UNIX_UIDs_GIDs (store UID/GID sizes/values using new extra field)
    UIDGID_NOT_16BIT     (old Unix 16-bit UID/GID extra field not used)
    [encryption, version 2.91 of 05 Jan 2007] (modified for Zip 3)

Editar: metadatos

Una respuesta sugiere que la diferencia son los metadatos del sistema que se almacenan en el zip. No creo que este pueda ser el caso. Para probar, hice lo siguiente:

for x in $(seq 10000) ; do touch $x ; done
zip allZip $(ls -1)

El archivo zip resultante es de 1,4 MB. Esto significa que todavía quedan ~ 10 MB de espacio sin explicación.

Respuesta:

Zip trata el contenido de cada archivo por separado al comprimir. Cada archivo tendrá su propia secuencia comprimida. Existe soporte dentro del algoritmo de compresión (típicamente DESINFLAR ) para identificar secciones repetidas. Sin embargo, Zip no es compatible con la búsqueda de redundancia entre archivos.

Es por eso que hay tanto espacio adicional cuando el contenido está en varios archivos: está colocando la misma secuencia comprimida en el archivo varias veces.

Leave a Comment

Your email address will not be published.

Scroll to Top

istanbul avukat

-

web tasarım