Mengubah file gzip menjadi bzip2 secara efisien


10

Saya memiliki banyak file gzip yang harus saya konversi menjadi bzip2 setiap saat. Saat ini, saya menggunakan skrip shell yang hanya 'gunzip setiap file dan kemudian' bzip2 itu. Meskipun ini berhasil, dibutuhkan banyak waktu untuk menyelesaikannya.

Apakah mungkin membuat proses ini lebih efisien? Saya siap untuk menyelam dan melihat kode sumber gunzip dan bzip2 jika perlu, tetapi saya hanya ingin memastikan hasilnya. Adakah harapan untuk meningkatkan efisiensi proses?

Jawaban:


1

Pertanyaan ini sudah lama ditanyakan ketika pbzip2 tidak tersedia atau tidak mampu mengompresi dari stdin, tetapi Anda sekarang dapat memparalelkan langkah-langkah kompresi dan kompresi menggunakan paralel dan pbzip2 (bukan bzip2 ):

ls *.gz | parallel "gunzip -c {} | pbzip2 -c > {.}.bz2"

yang secara signifikan lebih cepat daripada menggunakan bzip2 .


Hai, saya telah mengubah jawaban yang diterima untuk yang ini karena ini memberikan pilihan terbaik bagi orang-orang yang tersandung pada pertanyaan hari ini. Terima kasih untuk pbzip2menyebutkannya. Jika tautan tidak dimuat untuk orang lain, inilah halaman proyek dan halaman manual .
sundar - Reinstate Monica

15

Daripada gunzip di satu langkah dan bzip2 di yang lain, saya bertanya-tanya apakah mungkin akan lebih efisien untuk menggunakan pipa. Sesuatu sepertigunzip --to-stdout foo.gz | bzip2 > foo.bz2

Saya sedang berpikir dengan dua CPU atau lebih, ini pasti akan lebih cepat. Tetapi mungkin bahkan dengan hanya satu inti. Namun saya mengakui tidak pernah mencoba ini.


2
+1 untuk pemipaan, disk I / O adalah sesuatu yang ingin Anda hindari. Adapun kompresi, kecuali saya salah, bzip2 tidak paralel. Anda harus menggunakan sesuatu seperti pbzip2 untuk kompres di parallell: compression.ca/pbzip2
gustafc

... dan sayangnya, sepertinya tidak ada utilitas dekompresi parallell gzip yang tersedia.
gustafc

@ gustafc: Terima kasih atas tautannya ke pbzip2, itu sangat membantu ... @OP: Saya menghindari piping bcos. Saya ingin dapat menangani file gz yang korup, dll., tanpa kehilangan mereka di dalam pipa ...
sundar - Pasang kembali Monica

4
@ Gustafc: Sekalipun bzip2dan gziptidak bekerja secara paralel secara internal, dengan menggunakan pipa Anda dapat membuatnya bekerja secara paralel, karena sebuah pipa secara implisit memulai dua proses, yang akan berjalan secara paralel. Jadi setidaknya dekompresi dan kompresi akan berjalan secara paralel.
sleske

1
@ Alice, meskipun Anda benar dalam teori, bzip2penggunaan CPU mengerdilkan gunzipsatu, jadi dalam praktiknya paralelisme yang Anda dapatkan di sini sangat minim. Tidak harus melakukan IO disk masih bagus!
Johan Walles


3

Apa yang Anda lakukan saat ini adalah taruhan terbaik Anda. Tidak ada alat konversi yang tersedia, dan mencoba melakukan bzip2 file yang sudah di-gzip bukanlah pilihan, karena seringkali memiliki efek yang tidak diinginkan. Karena algoritmenya berbeda, pengubahan akan melibatkan pengambilan data asli apa pun. Kecuali tentu saja gzipping adalah langkah dalam proses bzip2, yang sayangnya tidak.


Jangan algoritma memiliki setiap langkah yang tumpang tindih sehingga saya bisa melewatkan satu langkah dalam dekompresi gzip dan sama di bzip kompresi juga?
sundar - Reinstate Monica

2
@sundar saya tidak akan berpikir begitu. gzipmenggunakan Leimpel-Ziv 77, sementara bzip2menggunakan Burrows-Wheeler. Algoritma yang berbeda, saya khawatir.
new123456

2

Kadang-kadang, saya perlu melakukan hal yang sama dengan file log. Saya mulai dengan file * .gz terkecil terlebih dahulu ( ls -rS), gunzip dan kemudian dan bzip2 secara individual. Saya tidak tahu apakah mungkin untuk mengarahkan output gunzip langsung ke input bzip2. Perintah bzip2 jauh lebih lambat dalam mengompresi daripada gunzip berada pada dekompresi sehingga ia dapat menghabiskan memori dan ruang swap pada host.

Perbaikan atau saran dipersilahkan. Ini satu-satunya liner saya:

for i in $(ls -rS *.gz | sed 's/\.gz//'); do gunzip ${i}.gz; bzip2 -9 ${i}; done

Terima kasih atas masukannya, poin tentang perbedaan kecepatan antara kedua proses dan implikasinya adalah yang penting.
sundar - Reinstate Monica


1

Baru saja melakukan ini beberapa menit yang lalu:

find . -name "*.gz" | perl -pi -e 's/\.gz$//g;' | xargs -n1 ./rezip

Di mana rezipakan didefinisikan sebagai:

#!/bin/bash
gunzip -v $1.gz && bzip2 -9v $1

Secara opsional, Anda juga dapat membuatnya multi-utas dengan menggunakan -Popsi dengan xargs, tetapi berhati-hatilah dengan opsi itu. (Mulai rendah!)

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.