Pourquoi les fichiers tar.xz sont-ils créés avec Python tar 15 fois plus petits que macOS tar

Environ. trad. : Ce n'est pas une traduction ordinaire, car elle n'est pas basée sur un article séparé, mais sur un cas récent avec Stack Exchange, qui est devenu le principal hit de la ressource ce mois-ci. Son auteur pose une question, dont la réponse s'est avérée être une véritable révélation pour certains visiteurs du site.





En compressant les répertoires d'environ 1,3 Go, chacun avec 1440 fichiers JSON, j'ai trouvé une différence de 15x entre la taille des archives compressées à l'aide de tar



macOS ou Raspbian 10 (Buster) et les archives obtenues à l'aide de la bibliothèque tarfile intégrée en Python.





Exemple de travail minimal

Ce script compare les deux méthodes:





#!/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")
      
      



Le résultat est le suivant:





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



Les versions suivantes ont été utilisées:





  • tar



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



    ;





  • tar



    Raspbian Ă  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) , -:





Ă€ gauche, zsh-archive.tar.xz, Ă  droite, 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