Mengapa file tar.xz dibuat dengan tar Python 15 kali lebih kecil dari tar macOS

Approx. terjemahan. : Ini bukan terjemahan biasa, karena tidak didasarkan pada artikel terpisah, tetapi kasus terbaru dengan Stack Exchange, yang menjadi hit utama sumber daya bulan ini. Penulisnya mengajukan pertanyaan, yang jawabannya ternyata merupakan wahyu nyata bagi beberapa pengunjung situs.





Mengompresi direktori sebesar ~ 1,3 GB, masing-masing dengan 1440 file JSON, saya menemukan perbedaan 15x antara ukuran arsip yang dikompresi menggunakan tar



macOS atau Raspbian 10 (Buster) dan arsip yang diperoleh menggunakan pustaka tarfile yang dibangun dengan Python.





Contoh kerja minimal

Skrip ini membandingkan kedua metode:





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



Hasilnya begini:





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



Versi berikut digunakan:





  • tar



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



    ;





  • tar



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





Di sebelah kiri adalah zsh-archive.tar.xz, di sebelah kanan adalah 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