Çok büyük (100G) dosyaları zipleme zamanı


27

Kendimi çok sayıda büyük dosya (80-ish GB) sıkıştırmak zorunda buluyorum ve sistemimin sergilediği (eksikliği) hızında şaşırdım. Yaklaşık 500 MB / dak dönüşüm hızı alıyorum; kullanarak top, yaklaşık% 100 bir tek CPU kullanıyor gibiyim.

(Sadece) disk erişim hızı olmadığından eminim, çünkü bir tardosya oluştururken (80G dosyası bu şekilde oluşturuldu) sadece birkaç dakika (belki 5 veya 10) sürdü, fakat 2 saatten daha sonra benim basit gzip komutum hala bitmiş değil.

Özetle:

tar -cvf myStuff.tar myDir/*

87 G tar dosyası oluşturmak için <5 dakika sürdü

gzip myStuff.tar

55G zip dosyası oluşturmak iki saat 10 dakika sürdü.

Sorum şu: Bu normal mi? gzipİşleri hızlandırmak için belirli seçenekler var mı? Komutları birleştirmek ve kullanmak daha hızlı olur tar -cvfzmu? pigz- GZip'in Paralel Uygulaması - referansını gördüm , ancak ne yazık ki kullandığım makineye yazılım yükleyemiyorum, bu benim için bir seçenek değil. Örneğin, bu önceki soruya bakınız .

Bu seçeneklerden bazılarını kendim denemek ve onları zamanlamak niyetindeyim - ancak seçeneklerin "sihirli kombinasyonunu" vurmama ihtimalim yüksek. Bu sitedeki birisinin işleri hızlandırmak için doğru numarayı bildiğini umuyorum.

Mevcut diğer denemelerin sonuçlarına ulaştığımda, bu soruyu güncelleyeceğim - ancak eğer özellikle iyi bir numara varsa, çok memnun olurum. Belki de gzip benim düşündüğümden daha fazla işlem sürüyor ...

GÜNCELLEŞTİRME

Söz verdiğim gibi, aşağıda önerilen ipuçlarını denedim: sıkıştırma miktarını ve dosyanın hedefini değiştirin. Yaklaşık 4.1 GB olan bir katran için aşağıdaki sonuçları aldım:

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

Evet, bayrak varsayılandan -6en -1hızlıya değiştirmek, bana% 30'luk bir hız kazandırdı (verilerim için) zip dosyasının boyutunda neredeyse hiçbir değişiklik olmadı. Aynı diski veya başka bir diski kullanıp kullanmamamın aslında hiçbir önemi yoktur (herhangi bir istatistiksel anlamlılık elde etmek için bunu birkaç kez çalıştırmam gerekir).

Herhangi biri ilgileniyorsa, aşağıdaki iki komut dosyasını kullanarak bu zamanlama ölçütlerini oluşturdum:

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

Ve ikinci senaryo ( 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

Dikkat edilmesi gereken üç şey:

  1. Yerine komutu yerine GNU komutundan daha az seçeneğe sahip /usr/bin/timeolduğundan time, bunun yerine kullanmakbash
  2. Her ne --formatkadar günlük dosyasının okunmasını kolaylaştıracak olmasına rağmen bu seçeneği kullanmıyorum
  3. Sadece bir komut timedizisinde sadece ilk komutta çalıştığı göründüğü için bir komut dosyasında bir script kullandım (bu yüzden tek bir komut gibi görünmesini sağladım ...).

Bütün bu öğrenilenlerle, sonuçlarım

  1. -1Bayrakla işleri hızlandır (kabul edilen cevap)
  2. Verileri sıkıştırmak, diskten okumak yerine çok daha fazla zaman harcıyor
  3. Daha hızlı sıkıştırma yazılımına yatırım yapın ( pigziyi bir seçim gibi görünüyor).
  4. Sıkıştırmak için birden fazla dosyanız varsa, her bir gzipkomutu kendi başlığına koyabilir ve mevcut CPU'nun (zavallı adamın pigz) daha fazlasını kullanabilirsiniz.

Tüm bunları öğrenmeme yardım eden herkese teşekkürler!


tar -cvf herhangi bir sıkıştırma yapmaz, bu yüzden daha hızlı olacaktır
parkydr

2
@ Floris: Ne tür verileri sıkıştırmaya çalışıyorsunuz? not: $> gzip -c myStuff.tar | pv -r -b > myStuff.tar.gzmakinenizin malzemelerini ne kadar hızlı sıkıştırdığını gösterir. 2. not2: sonucu farklı bir diske kaydedin.
akira

3
Üzgünüm, sorunuzu yanlış anladım. gzip en hızlı sıkıştırmayı seçmek için --fast seçeneğine sahiptir
parkydr

1
@parkydr: --fast seçeneği bilmediğim bir şey ... mansayfadaki sonuncusu , ve o kadar okumadım (çünkü 'tek harfli komut' ile sıralanır -#) . Bu bana RTFM'ye öğretecek! Bu deneyeceğim bir sonraki şey olacak!
Floris

2
Makinede uygun bir derleyici varsa ve dosya sistemi izinlerinin, erişebileceğiniz dizinlerden ikili dosyaların yürütülmesini yasaklayacak şekilde ayarlanmamışsa, pigzonu kurmadan , derlemeniz ve çalıştığınız yerden çalıştırabilmeniz için çalıştırabilirsiniz. Derleyici yoksa, başka bir bilgisayarda çapraz derleme yapabilir, ancak buna değecek kadar çaba sarf etmeye başlayabilirsiniz. (Bu sıkıştırmanın daha hızlı çalışması için ne kadar fena ihtiyacınız olduğuna bağlı olarak, sanırım.)
David Z

Yanıtlar:


27

Sen kullanarak gzip hızını değiştirebilir --fast --bestveya -## 1 ile 9 arasında bir sayıdır (1 9 en yavaş ama daha sıkıştırma olduğunu, en hızlı ancak daha az sıkıştırma olan). Varsayılan olarak gzip 6. seviyede çalışır.


26

Katranın gzip ile karşılaştırıldığında çok az zaman almasının nedeni, dosyalarınızı tek bir dosyaya kopyalamak için çok az hesaplama ek yükü bulunmasıdır (ne yaparsa). Diğer taraftan gzip, aslında tar dosyasını küçültmek için sıkıştırma algoritmaları kullanıyor.

Sorun şu ki, gzip'in (keşfettiğiniz gibi) tek bir konu ile sınırlı olması.

Sıkıştırmayı gerçekleştirmek için birden fazla iş parçacığı kullanabilen pigz'i girin . Bunun nasıl kullanılacağına bir örnek:

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

Bir abla sitesinde - use-compress-program seçeneğinin güzel bir özeti var .


Cevabınız ve bağlantılar için teşekkür ederiz. Aslında sorudaki domuzdan bahsettim.
Floris

İşte bu doğru cevap ..!
stolsvik

4

Yaklaşık% 100 oranında tek bir CPU kullanıyor gibiyim.

Bu, bir G / Ç performansı sorunu olmadığını ancak sıkıştırmanın yalnızca bir iş parçacığı (gzip için geçerli olacak) kullandığı anlamına gelir.

Diğer araçları kurmak için gereken erişim / anlaşmayı başarmayı başarırsanız, 7zip ayrıca çoklu çekirdekli işlemcilerden yararlanmak için birden fazla iş parçacığını da destekler, ancak bunun gzip biçimine de uygun olup olmadığından emin değilim.

Şu an için sadece gzip kullanmakta zorlanıyorsanız ve sıkıştırmak için birden fazla dosyanız varsa, bunları ayrı ayrı sıkıştırmayı deneyebilirsiniz - bu şekilde birden fazla işlemi paralel olarak birden çok işlem uygulayarak bu çok çekirdekli işlemciden daha fazlasını kullanırsınız. Ancak aşırıya kaçmamaya dikkat edin, çünkü G / Ç alt sistem performansınızın kapasitesine yakın bir yere varır ulaşmaz, baş hareketlerinin gecikmesi önemli bir hal aldıkça (bir işlem / iplik kullanıyor olmanıza göre daha düşük) kademeli olarak düşecektir. darboğaz.


giriş için teşekkürler. Bana bir fikir verdiniz (bunun için bir oylama kazanıyorsunuz): oluşturmak için birden fazla arşivim olduğu için, sırasıyla tek tek komutları yazabiliyorum &- sonra sistemin oradan ilgilenmesine izin verdim . Her biri kendi işlemcisi üzerinde çalışacak ve sıkıştırma için G / Ç'den çok daha fazla zaman harcadığım için, bunların hepsini de aynı şekilde yapmak da aynı süreyi alacak. Bu yüzden, tek iş parçacıklı bir çalıştırılabilir programdan "çok çekirdekli performans" alıyorum ...
Floris

1

Kişi, aşağıdaki komutta gösterildiği gibi genellikle daha hızlı performans sağlayan pigz'de de mevcut olan işlem sayısından faydalanabilir.

tar cf - arşivlenecek dizin | pigz -0 -p largenumber> mydir.tar.gz

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

Bu büyük olasılıkla -p yazısında önerilen yöntemlerden daha hızlıdır, çünkü birinin çalışabileceği işlem sayısıdır. Kişisel deneyimime göre, arşivlenecek dizin çok sayıda küçük dosyadan oluşuyorsa, çok büyük bir değerin ayarlanması performansı etkilemez. Düşünülen varsayılan değer 8'dir. Büyük dosyalar için önerim, bu değeri sistemde desteklenen toplam iş parçacığı sayısı olarak ayarlamak olacaktır.

32 CPU makinesinde p = 32 değerinin ayarlanması örnek yardımcı olur.

0, arşivi sıkıştırmadığı ve hıza odaklandığı için en hızlı pigz sıkıştırması içindir. Sıkıştırma için varsayılan değer 6'dır.

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.