Saya menemukan diri saya harus mengkompres sejumlah file yang sangat besar (80-ish GB), dan saya terkejut dengan (kurangnya) kecepatan sistem saya menunjukkan. Saya mendapatkan sekitar 500 MB / menit kecepatan konversi; menggunakan top
, saya tampaknya menggunakan CPU tunggal sekitar 100%.
Saya cukup yakin itu bukan kecepatan akses disk (hanya), karena membuat tar
file (begitulah file 80G dibuat) hanya membutuhkan waktu beberapa menit (mungkin 5 atau 10), tetapi setelah lebih dari 2 jam perintah gzip sederhana saya masih belum selesai.
Singkatnya:
tar -cvf myStuff.tar myDir/*
Butuh waktu <5 menit untuk membuat file tar 87 G
gzip myStuff.tar
Butuh waktu dua jam 10 menit, membuat file zip 55G.
Pertanyaan saya: Apakah ini normal? Apakah ada opsi tertentu gzip
untuk mempercepat? Apakah akan lebih cepat untuk menggabungkan perintah dan menggunakan tar -cvfz
? Saya melihat referensi untuk pigz
- Implementasi Paralel GZip - tetapi sayangnya saya tidak dapat menginstal perangkat lunak pada mesin yang saya gunakan, jadi itu bukan pilihan bagi saya. Lihat misalnya pertanyaan sebelumnya ini .
Saya bermaksud mencoba beberapa opsi ini sendiri dan mengatur waktunya - tetapi sangat mungkin bahwa saya tidak akan menekan "kombinasi ajaib" dari opsi. Saya berharap seseorang di situs ini tahu trik yang tepat untuk mempercepat.
Ketika saya memiliki hasil uji coba lain yang tersedia saya akan memperbarui pertanyaan ini - tetapi jika ada yang punya trik yang sangat baik tersedia, saya akan sangat menghargainya. Mungkin gzip hanya membutuhkan waktu pemrosesan lebih dari yang saya sadari ...
MEMPERBARUI
Seperti yang dijanjikan, saya mencoba trik ini di bawah ini: mengubah jumlah kompresi, dan mengubah tujuan file. Saya mendapat hasil sebagai berikut untuk tar yang sekitar 4.1GB:
flag user system size sameDisk
-1 189.77s 13.64s 2.786G +7.2s
-2 197.20s 12.88s 2.776G +3.4s
-3 207.03s 10.49s 2.739G +1.2s
-4 223.28s 13.73s 2.735G +0.9s
-5 237.79s 9.28s 2.704G -0.4s
-6 271.69s 14.56s 2.700G +1.4s
-7 307.70s 10.97s 2.699G +0.9s
-8 528.66s 10.51s 2.698G -6.3s
-9 722.61s 12.24s 2.698G -4.0s
Jadi ya, mengubah bendera dari default -6
ke tercepat -1
memberi saya speedup 30%, dengan (untuk data saya) hampir tidak ada perubahan pada ukuran file zip. Apakah saya menggunakan disk yang sama atau yang lain pada dasarnya tidak membuat perbedaan (saya harus menjalankan ini beberapa kali untuk mendapatkan signifikansi statistik).
Jika ada yang tertarik, saya membuat tolok ukur waktu ini menggunakan dua skrip berikut:
#!/bin/bash
# compare compression speeds with different options
sameDisk='./'
otherDisk='/tmp/'
sourceDir='/dirToCompress'
logFile='./timerOutput'
rm $logFile
for i in {1..9}
do /usr/bin/time -a --output=timerOutput ./compressWith $sourceDir $i $sameDisk $logFile
do /usr/bin/time -a --output=timerOutput ./compressWith $sourceDir $i $otherDisk $logFile
done
Dan skrip kedua ( compressWith
):
#!/bin/bash
# use: compressWith sourceDir compressionFlag destinationDisk logFile
echo "compressing $1 to $3 with setting $2" >> $4
tar -c $1 | gzip -$2 > $3test-$2.tar.gz
Tiga hal yang perlu diperhatikan:
- Menggunakan
/usr/bin/time
daripadatime
, karena perintah bawaanbash
memiliki banyak pilihan lebih sedikit daripada perintah GNU - Saya tidak repot-repot menggunakan
--format
opsi meskipun itu akan membuat file log lebih mudah dibaca - Saya menggunakan skrip-dalam-skrip karena
time
sepertinya hanya beroperasi pada perintah pertama dalam urutan pipa (jadi saya membuatnya terlihat seperti satu perintah ...).
Dengan semua ini dipelajari, kesimpulan saya adalah
- Percepat dengan
-1
bendera (jawaban yang diterima) - Jauh lebih banyak waktu dihabiskan mengompresi data daripada membaca dari disk
- Investasikan dalam perangkat lunak kompresi yang lebih cepat (
pigz
sepertinya pilihan yang baik). - Jika Anda memiliki banyak file untuk dikompres, Anda dapat menempatkan setiap
gzip
perintah di utasnya sendiri dan menggunakan lebih banyak CPU yang tersedia (orang miskinpigz
)
Terima kasih semua orang yang membantu saya mempelajari semua ini!
$> gzip -c myStuff.tar | pv -r -b > myStuff.tar.gz
akan menunjukkan seberapa cepat mesin Anda mengompresi barang. side-note2: simpan hasilnya ke disk yang berbeda.
man
halaman, dan saya tidak membaca sejauh itu (karena diurutkan berdasarkan 'perintah huruf tunggal', yaitu -#
) . Itu akan mengajari saya ke RTFM! Ini akan menjadi hal berikutnya yang saya coba!
pigz
dan menjalankannya dari mana pun Anda membangunnya, tanpa menginstalnya. Jika tidak ada kompiler, Anda bisa melakukan kompilasi silang pada komputer lain, meskipun itu mulai lebih banyak upaya daripada yang mungkin layak dilakukan. (Tergantung seberapa parah Anda memerlukan kompresi ini untuk berjalan lebih cepat, saya kira.)