Ca. übers. : Dies ist keine gewöhnliche Übersetzung, da sie nicht auf einem separaten Artikel basiert, sondern auf einem aktuellen Fall mit Stack Exchange, der diesen Monat zum Haupthit der Ressource wurde. Der Autor stellt eine Frage, deren Antwort sich für einige Website-Besucher als echte Offenbarung herausstellte.
Beim Komprimieren von Verzeichnissen um ~ 1,3 GB mit jeweils 1440 JSON-Dateien stellte ich einen 15-fachen Unterschied zwischen der Größe von Archiven fest, die mit tar
macOS oder Raspbian 10 (Buster) komprimiert wurden, und Archiven, die mit der in Python integrierten Tarfile- Bibliothek erstellt wurden .
Minimales Arbeitsbeispiel
Dieses Skript vergleicht beide Methoden:
#!/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")
Das Ergebnis ist folgendes:
zsh tar filesize: 23.7 MB py tar filesize: 1.49 MB
Folgende Versionen wurden verwendet:
tar
unter MacOS :bsdtar 3.3.2 - libarchive 3.3.2 zlib/1.2.11 liblzma/5.0.5 bz2lib/1.0.6
;
tar
Raspbian um 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!
: