Contexte
Je compresse des dossiers d'environ 1,3 Go contenant chacun 1 440 fichiers JSON et je constate que la différence est de 15 fois supérieure entre l'utilisation de la fonction tar
et la commande intégrée de Python tarfile
sur macOS ou Raspbian 10 (Buster)
Exemple de fonctionnement 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")
La sortie est :
zsh tar filesize: 23.7 MB
py tar filesize: 1.49 MB
Les versions que j'utilise sont les suivantes :
-
tar
sur macOS :bsdtar 3.3.2 - libarchive 3.3.2 zlib/1.2.11 liblzma/5.0.5 bz2lib/1.0.6
-
tar
sur Raspbian 10 :xz (XZ Utils) 5.2.4 liblzma 5.2.4
-
tarfile
Bibliothèque Python :0.9.0
Les choses que j'ai essayées
Après compression, j'ai extrait les deux archives et comparé le dossier résultant avec :
diff -r py-archive-expanded zsh-archive-expanded
Il n'y avait aucune différence.
Si je compare directement les deux archives tar, elles semblent différentes :
diff zsh-archive.tar.xz py-archive.tar.xz
Binary files zsh-archive.tar.xz and py-archive.tar.xz differ
Si j'inspecte les archives avec Quicklook (et le plugin Betterzip), je constate que les fichiers de l'archive sont classés d'une manière différente :
La gauche est zsh-archive.tar.xz
le droit est py-archive.tar.xz
:
L'archive zsh utilise un ordre inconnu, et l'archive Python ordonne le fichier par date de modification. Je ne suis pas sûr que cela ait de l'importance.
Question
Que se passe-t-il ? Est-ce que je perds quelque chose en utilisant la bibliothèque Python pour compresser mes données ? La différence de taille de 15 fois est-elle un indicateur d'un problème quelconque ? Ou puis-je continuer à utiliser l'implémentation efficace de Python en toute sécurité ?