2013-04-22 9 views
10

Çok sayıda dosyayı tek bir zip dosyasına sıkıştırmak için Python 2.7.4 zipfile modülüne (ZIP_DEFLATED ile) dikkate değer ölçüde daha hızlı bir alternatif var mı? Ben czipfile https://pypi.python.org/pypi/czipfile/1.0.0 bir göz vardı, ama bu daha hızlı şifreleme (sıkıştırma değil) odaklanmış gibi görünüyor.Python'un zip dosyası modülüne daha hızlı bir alternatif mi?

Her dosyada ~ 1MB - 6MB arasında (ve ~ 9 GB) tüm dosyalar için çok sayıda görüntü dosyası (.exr ve .tiff dosyalarının birleşiminden 12.000 dosya) işlemek zorundayım) sevkiyat için tek bir zip dosyasına. Bu sıkıştırma işleminin yapılması 90 dakika sürüyor (Windows 7 64bit üzerinde çalışıyor).

kimse zipfile modül daha kısa sürede tek bir .zip dosyasında dosyaların çok sayıda sıkıştırmak mümkün olacaktır farklı bir piton modülünü (ya da alternatif bir C/C++ kütüphanesi ve hatta tek başına bir araç) tavsiye edebilir , Bu çok takdir olurdu (~% 5-10 daha hızlı bir şey (veya daha fazla) çok yararlı olacaktır).

+2

En kötüsü, her zaman kabuğunu çağırabilir ve python'dan 7zip gibi bir şey yürütebilirsiniz – Patashu

+1

Sıkıştırmakta olduğunuz görüntü dosyaları, kendi dosya biçimlerinin sıkıştırma sürümlerini zaten kullanıyor mu? Eğer öyleyse, muhtemelen ZIP_STORED yerine ZIP_DEFLATED kullanarak az kazançla tekrar sıkıştırmaya çalışırken önemli bir işlem süresi harcıyorsunuz demektir. Ayrıca, hem Python 2 & 3 için dokümanlar, ['zipfile'] (http://docs.python.org/2/library/zipfile.html#module-zipfile) modülünün yalnızca şifrelenmiş dosyaların şifrelenmesini desteklediğini söyler. ZIP arşivleri, onları yaratmıyor - nasıl yapıyorsun? – martineau

+0

@Patashu öneriniz için teşekkürler, bir deneyin ve performansı test edeceğim. Dosyaların .zip dosyaları olması gerekir, aksi takdirde diğer paketleme formatları ile daha fazla deneylerim. –

cevap

4

Patashu'nun bahsettiği gibi, 7-zip'e dış kaynak kullanımı en iyi fikir olabilir.

İşte başlangıç ​​için bazı örnek kod:

import os 
import subprocess 

path_7zip = r"C:\Program Files\7-Zip\7z.exe" 
path_working = r"C:\temp" 
outfile_name = "compressed.zip" 
os.chdir(path_working) 

ret = subprocess.check_output([path_7zip, "a", "-tzip", outfile_name, "*.txt", "*.py", "-pSECRET"]) 

martineau Eğer sıkıştırma yöntemleri ile deneme olabilir belirtildiği gibi. This page, komut satırı parametrelerinin nasıl değiştirileceğine dair bazı örnekler verir.

+1

Herkese yardım için teşekkürler. 7-zip'e (.exr dosyalarının 1GB'lik bir alt kümesinde) dış kaynak kullanımı sıkıştırma zamanını gerçekten harika olan zipfile sıkıştırmasına kıyasla yaklaşık% 52 oranında hızlandırdı. Ben hala 7zip ayarlanmış ayarları ile karşılaştırıldığında Martinart önerdiği sıkıştırılmamış sürümü üzerinde bazı testler yapıyorum, ama 7zip çözüm kesinlikle bir iyileşme olacak gibi görünüyor. –

+1

@ michaelhubbard.ca: 7-Zip kullanımı iyi bir seçimdir, bu tür şeyler için mükemmel bir yardımcı programdır. Not: Sadece '' 7za.exe '' denilen, sadece 574 KB'lık ve muhtemelen ihtiyacınız olan bir komut satırı var. Ayrıca, lütfen bir yere bir yorum ekleyiniz ve sadece sıkıştırmanın vs sıkıştırmanın ne gibi bir fark yarattığını bize bildirin. – martineau

+0

@ michaelhubbard.ca: 7-Zip'in de bu seçeneğe ilgi duyduğunuzu belirttiğiniz için çok iyi şifreleme seçeneklerine sahip olduğundan bahsetmeyi unuttum. – martineau