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) , -:
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 »;
-
-