Gzip dosyalarını bzip2'ye verimli bir şekilde dönüştürme


10

Her seferinde ve sonra bzip2'ye dönüştürmem gereken bir sürü gzip dosyam var. Şu anda, sadece 'gunzip's her dosya ve daha sonra' bzip2's bir kabuk betiği kullanıyorum. Bu işe yaramasına rağmen, tamamlanması çok zaman alıyor .

Bu süreci daha verimli hale getirmek mümkün mü? Dalış yapmaya ve gerekirse gunzip ve bzip2'nin kaynak kodlarına bakmaya hazırım, ancak kazancından emin olmak istiyorum. Sürecin etkinliğini arttırma konusunda herhangi bir umut var mı?

Yanıtlar:


1

Bu soru, uzun zaman önce pbzip2'nin uygun olmadığı veya stdin'i sıkıştıramadığı durumlarda sorulmuştu , ancak şimdi paralel ve pbzip2'yi ( bzip2 yerine ) kullanarak hem sıkıştırma hem de sıkıştırma adımlarını paralel hale getirebilirsiniz :

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

bzip2 kullanmaktan çok daha hızlıdır .


Merhaba, bu sorunun cevabını değiştirdim çünkü bu, bugün soruya karışan insanlar için en iyi seçeneği sunuyor. Bahsettiğin için teşekkürler pbzip2. Bağlantının başkaları için yüklenmemesi durumunda, işte proje sayfası ve man sayfası .
sundar

15

Bir adımda gunzip ve diğerinde bzip2 yerine, boru kullanmanın daha verimli olup olmayacağını merak ediyorum. Gibi bir şeygunzip --to-stdout foo.gz | bzip2 > foo.bz2

İki veya daha fazla CPU ile düşünüyorum, bu kesinlikle daha hızlı olurdu. Ama belki sadece tek bir çekirdekli bile. Utanç verici olsa da, bunu denememiş olduğunu itiraf ediyorum.


2
Borular için +1, disk G / Ç kullanmaktan kaçınmak istediğiniz bir şeydir. Sıkıştırma gelince, yanlış anlamadığım sürece, bzip2 paralel değildir. Parallell içinde sıkıştırmak için pbzip2 gibi bir şey kullanmanız gerekir: sıkıştırma.ca
pbzip2

... ve ne yazık ki, mevcut hiçbir paralellik gzip dekompresyon yardımcı programı görünmüyor.
gustafc

@gustafc: pbzip2 bağlantısı için teşekkür ederim, bu çok yardımcı oldu ... @OP: Borulardaki bcos'lardan uzak durdum, bozuk gz dosyaları vs. ile uğraşmak istiyorum.
sundar

4
@gustafc: Bile bzip2ve gzipbir boru kullanarak, dahili olarak paralel çalışmayan bir boru örtülü olarak iki süreci başlatır çünkü onları paralel olarak çalışabilirler olabilir olacak paralel olarak çalıştırılır. Dolayısıyla en azından dekompresyon ve sıkıştırma paralel olarak çalışacaktır.
sleske

1
Sleske, teoride haklı olsanız bile, bzip2CPU kullanımı gunzipbirini cüceler , bu yüzden pratikte buraya aldığınız paralellik minimumdur. Disk yapmak zorunda kalmamak IO yine de güzel!
Johan Walles

6

GNU paralel ( http://www.gnu.org/software/parallel ), birden fazla çekirdeğiniz varsa (veya birden fazla makineniz varsa) bir seçenek olabilir:

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

Ayrıntılar ve seçenekler için öğretici / man sayfasını okuyun.


3

Şu anda yaptığın en iyi şey. Kullanılabilir bir dönüştürme aracı yoktur ve zaten gzip edilmiş bir dosyayı bzip2'ye sokmaya çalışmak, genellikle istenmeyen efektlere sahip olduğundan, gerçekten bir seçenek değildir. Algoritma farklı olduğu için, dönüştürme ne olursa olsun orijinal verilerin alınmasını gerektirir. Elbette, gzipping, bzip2 sürecinde, ne yazık ki olmadığı bir adımdı.


Algoritmalar yok mu herhangi Bir gzip dekompresyon adımı ve ayrıca bzip sıkıştırma aynı atlamak ki böyle örtüşen adımlar?
sundar

2
@ sundar Öyle sanmıyorum. Burrows-Wheeler gzipkullanırken Leimpel-Ziv 77 bzip2kullanırken. Farklı algoritmalar, korkarım.
new123456,

2

Bazen, aynı şeyi günlük dosyalarında da yapmam gerekiyor. En küçük * .gz dosyalarıyla ilk ( ls -rS), gunzip ve sonra bzip2 ile başlıyorum . Gunzip çıkışını doğrudan bzip2 girişine yönlendirmenin mümkün olup olmadığını bilmiyorum. Bzip2 komutu, sıkıştırma işleminde gunzip'in dekompresyonda olduğundan çok daha yavaştır, belleği tüketir ve ana bilgisayarda yer değiştirebilir.

İyileştirmeler veya önerilerinizi bekliyoruz. İşte benim astarım:

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

Girdi için teşekkürler, iki işlem ve bunun uygulanması arasındaki hız farkıyla ilgili nokta önemli.
sundar


1

Bunu birkaç dakika önce yapmalıydım:

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

Nerede reziptanımlanır:

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

İsteğe bağlı olarak, bir -Pseçeneği kullanarak çok iş parçacıklı hale getirebilirsiniz xargs, ancak buna dikkat edin. (Düşük başla!)

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.