Saatnya untuk zip file yang sangat besar (100G)


27

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 tarfile (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 gzipuntuk 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 -6ke tercepat -1memberi 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:

  1. Menggunakan /usr/bin/timedaripada time, karena perintah bawaan bashmemiliki banyak pilihan lebih sedikit daripada perintah GNU
  2. Saya tidak repot-repot menggunakan --formatopsi meskipun itu akan membuat file log lebih mudah dibaca
  3. Saya menggunakan skrip-dalam-skrip karena timesepertinya hanya beroperasi pada perintah pertama dalam urutan pipa (jadi saya membuatnya terlihat seperti satu perintah ...).

Dengan semua ini dipelajari, kesimpulan saya adalah

  1. Percepat dengan -1bendera (jawaban yang diterima)
  2. Jauh lebih banyak waktu dihabiskan mengompresi data daripada membaca dari disk
  3. Investasikan dalam perangkat lunak kompresi yang lebih cepat ( pigzsepertinya pilihan yang baik).
  4. Jika Anda memiliki banyak file untuk dikompres, Anda dapat menempatkan setiap gzipperintah di utasnya sendiri dan menggunakan lebih banyak CPU yang tersedia (orang miskin pigz)

Terima kasih semua orang yang membantu saya mempelajari semua ini!


tar -cvf tidak melakukan kompresi sehingga akan lebih cepat
parkydr

2
@ Floris: data apa yang ingin Anda kompres? catatan samping: $> gzip -c myStuff.tar | pv -r -b > myStuff.tar.gzakan menunjukkan seberapa cepat mesin Anda mengompresi barang. side-note2: simpan hasilnya ke disk yang berbeda.
akira

3
Maaf, saya salah membaca pertanyaan Anda. gzip memiliki opsi - cepat untuk memilih kompresi tercepat
parkydr

1
@parkydr: Opsi - cepat adalah yang saya tidak tahu ... itu yang terakhir di manhalaman, 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!
Floris

2
Perhatikan bahwa jika kompiler yang sesuai tersedia di mesin, dan izin sistem file tidak diatur untuk melarang mengeksekusi binari dari direktori yang Anda memiliki akses, Anda dapat mengkompilasi pigzdan 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.)
David Z

Jawaban:


27

Anda dapat mengubah kecepatan gzip menggunakan --fast --bestatau di -#mana # adalah angka antara 1 dan 9 (1 adalah yang tercepat tetapi lebih sedikit kompresi, 9 paling lambat tetapi lebih banyak kompresi). Secara default gzip berjalan di level 6.


26

Alasan tar membutuhkan waktu yang sangat sedikit dibandingkan dengan gzip adalah karena ada sedikit overhead komputasi dalam menyalin file Anda ke dalam satu file (yang memang demikian). gzip di sisi lain, sebenarnya menggunakan algoritma kompresi untuk mengecilkan file tar.

Masalahnya adalah bahwa gzip dibatasi (seperti yang Anda temukan) menjadi satu utas.

Masukkan pigz , yang dapat menggunakan banyak utas untuk melakukan kompresi. Contoh cara menggunakan ini adalah:

tar -c --use-compress-program=pigz -f tar.file dir_to_zip

Ada ringkasan succint yang bagus dari opsi --use-kompres-program di situs saudara .


Terima kasih atas jawaban dan tautan Anda. Saya sebenarnya menyebutkan pigz dalam pertanyaan itu.
Floris

Ini jawaban yang benar di sini ..!
stolsvik

4

Saya tampaknya menggunakan CPU tunggal sekitar 100%.

Itu menyiratkan tidak ada masalah kinerja I / O tetapi bahwa kompresi hanya menggunakan satu utas (yang akan menjadi kasus dengan gzip).

Jika Anda berhasil mencapai akses / perjanjian yang diperlukan untuk menginstal alat lain, maka 7zip juga mendukung banyak utas untuk memanfaatkan CPU multi-core, meskipun saya tidak yakin apakah itu meluas ke format gzip dan juga miliknya.

Jika Anda terjebak untuk menggunakan hanya gzip untuk saat ini dan memiliki beberapa file untuk dikompres, Anda dapat mencoba mengompresnya secara individual - dengan cara itu Anda akan menggunakan lebih banyak CPU multi-inti dengan menjalankan lebih dari satu proses secara paralel. Berhati-hatilah untuk tidak berlebihan karena segera setelah Anda mendekati kapasitas kinerja subsistem I / O Anda akan menurun secara drastis (menjadi lebih rendah daripada jika Anda menggunakan satu proses / utas) karena latensi pergerakan head menjadi signifikan kemacetan.


terima kasih atas masukan Anda. Anda memberi saya ide (untuk itu Anda mendapatkan upvote): karena saya memiliki banyak arsip untuk dibuat, saya hanya dapat menulis perintah individu diikuti oleh &- kemudian biarkan sistem mengurusnya dari sana. Masing-masing akan berjalan pada prosesornya sendiri, dan karena saya menghabiskan lebih banyak waktu pada kompresi daripada pada I / O, itu akan mengambil waktu yang sama untuk melakukan satu untuk melakukan semua 10 dari mereka. Jadi saya mendapatkan "kinerja multi-core" dari executable yang di-threaded tunggal ...
Floris

1

Satu dapat mengeksploitasi jumlah proses yang tersedia juga dalam pigz yang biasanya kinerja lebih cepat seperti yang ditunjukkan pada perintah berikut

tar cf - direktori untuk arsip | pigz -0 -p largenumber> mydir.tar.gz

Contoh - tar cf - patha | pigz -0 -p 32> patha.tar.gz

Ini mungkin lebih cepat daripada metode yang disarankan dalam posting karena -p adalah jumlah proses yang dapat dijalankan. Dalam pengalaman pribadi saya, menetapkan nilai yang sangat besar tidak merusak kinerja jika direktori yang akan diarsipkan terdiri dari sejumlah besar file kecil. Jika nilai default yang dipertimbangkan adalah 8. Untuk file besar, rekomendasi saya adalah mengatur nilai ini sebagai jumlah total utas yang didukung pada sistem.

Contoh pengaturan nilai p = 32 jika 32 mesin CPU membantu.

0 dimaksudkan untuk kompresi pigz tercepat karena tidak memampatkan arsip dan lebih difokuskan pada kecepatan. Nilai default adalah 6 untuk kompresi.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.