¿Por qué los archivos tar.xz se crean con Python tar 15 veces más pequeños que macOS tar?

Aprox. transl. : Esta no es una traducción ordinaria, porque no se basa en un artículo separado, sino en un caso reciente con Stack Exchange, que se convirtió en el principal éxito del recurso este mes. Su autor hace una pregunta, cuya respuesta resultó ser una verdadera revelación para algunos visitantes del sitio.





Al comprimir directorios en ~ 1.3 GB, cada uno con 1440 archivos JSON, encontré una diferencia de 15 veces entre el tamaño de los archivos comprimidos con tar



macOS o Raspbian 10 (Buster) y los archivos obtenidos con la biblioteca tarfile incorporada en Python.





Ejemplo de trabajo mínimo

Este script compara ambos métodos:





#!/usr/bin/env python3

from pathlib import Path 
from subprocess import call 
import tarfile

fullpath = Path("/Users/user/Desktop/temp/tar/2021-03-11") 
zsh_out = Path(fullpath.parent, "zsh-archive.tar.xz") 
py_out = Path(fullpath.parent, "py-archive.tar.xz")

# tar using terminal 
# tar cJf zsh-archive.tar.xz folderpath
call(["tar", "cJf", zsh_out, fullpath])

# tar using tarfile library 
with tarfile.open(py_out, "w:xz") as tar:
    tar.add(fullpath, arcname=fullpath.stem)

# Print filesizes 
print(f"zsh tar filesize: {round(Path(zsh_out).stat().st_size/(1024*1024), 2)} MB") 
print(f"py tar filesize: {round(Path(py_out).stat().st_size/(1024*1024), 2)} MB")
      
      



El resultado es este:





zsh tar filesize: 23.7 MB
py tar filesize: 1.49 MB
      
      



Se utilizaron las siguientes versiones:





  • tar



    en MacOS: bsdtar 3.3.2 - libarchive 3.3.2 zlib/1.2.11 liblzma/5.0.5 bz2lib/1.0.6



    ;





  • tar



    Raspbian a 10: xz (XZ Utils) 5.2.4 liblzma 5.2.4



    ;





  • tarfile



    Python: 0.9.0



    .





:





diff -r py-archive-expanded zsh-archive-expanded
      
      



.





« » ( ) :





➜ diff zsh-archive.tar.xz py-archive.tar.xz
Binary files zsh-archive.tar.xz and py-archive.tar.xz differ
      
      



Quicklook ( Betterzip) , -:





A la izquierda está zsh-archive.tar.xz, a la derecha está py-archive.tar.xz.
— zsh-archive.tar.xz, — py-archive.tar.xz.

zsh



, Python — . , .





? ? , Python- ? 15- - Python-?





: , tarlib



Python ; BSD- tar



.





:

, , BSD- GNU- tar



.





GNU tar



--sort



:





ORDER



, none



, name



inode



.





--sort=none



— , .





GNU tar

GNU tar



Mac:





brew install gnu-tar
      
      



'tar' , --sort



:





gtar --sort='name' -cJf zsh-archive-sorted.tar.xz /Users/user/Desktop/temp/tar/2021-03-11
      
      



zsh-archive-sorted.tar.xz



1,5 — , , Python-.





, , JSON-, ( — unixtime), BSD tar



:





cat *.json > all.txt
tar cJf zsh-cat-archive.tar.xz all.txt
      
      



zsh-cat-archive.tar.xz



1,5 .





Python- tarfile

, TarFile.add Python , tarfile



Python :





. , recursive False. .





, , , :





JSON- . , .





, . , .





P.S.

UPD: — XZ/LZMA — , @iliazeus!





:





  • «Git happens! 6 Git »;





  • « »;





  • « ».








All Articles