2017-04-10 79 views
0

我是新來的並行處理在python。我在下面有一段代碼,它遍歷所有目錄並解壓縮所有tar.gz文件。但是,這需要相當長的一段時間。Python並行處理解壓文件

import tarfile 
import gzip 
import os 

def unziptar(path): 
    for root, dirs, files in os.walk(path): 
     for i in files: 
      fullpath = os.path.join(root, i) 
      if i.endswith("tar.gz"): 
       print 'extracting... {}'.format(fullpath) 
       tar = tarfile.open(fullpath, 'r:gz') 
       tar.extractall(root) 
       tar.close() 

path = 'C://path_to_folder' 
unziptar(path) 

print 'tar.gz extraction completed' 

我一直在尋找通過一些職位多和JOBLIB軟件包,但我還是不太V清除如何修改我的腳本運行並行。任何幫助表示讚賞。

編輯:@tdelaney

感謝您的幫助,令人驚訝的是,修改後的腳本花兩倍的時間來解壓縮一切(60分鐘比較原始腳本到30分鐘)!

我看了一下任務管理器,看起來,雖然使用了多核,但CPU使用率卻很低。我不確定爲什麼會這樣。

enter image description here

回答

2

它很容易創建池做的工作。只需將提取器拉出到一個單獨的工作人員。

import tarfile 
import gzip 
import os 
import multiprcessing as mp 

def unziptar(fullpath): 
    """worker unzips one file""" 
    print 'extracting... {}'.format(fullpath) 
    tar = tarfile.open(fullpath, 'r:gz') 
    tar.extractall(os.path.dirname(fullpath)) 
    tar.close() 

def fanout_unziptar(path): 
    """create pool to extract all""" 
    my_files = [] 
    for root, dirs, files in os.walk(path): 
     for i in files: 
      if i.endswith("tar.gz"): 
       my_files.append(os.path.join(root, i)) 

    pool = mp.Pool(min(mp.cpu_count(), len(my_files))) # number of workers 
    pool.map(unziptar, my_files, chunksize=1) 
    pool.close() 


if __name__=="__main__": 
    path = 'C://path_to_folder' 
    fanout_unziptar(path) 
    print 'tar.gz extraction completed' 
+0

哦,我想你的例子終於弄清楚了〜lemmi試試腳本! – Jake

+0

嗯我有一個錯誤:「SyntaxERror:無效的語法。」 「pool.map(unziptar,my_files,chunksize = 1)」你知道爲什麼嗎? – Jake

+0

啊啊,那個右括號...我可以再問一個問題嗎?我在windows上運行,腳本變得瘋狂了〜並且不停地提示添加「if __name__ =='__main__':freeze_support()」。該消息是「試圖在當前進程完成其啓動階段之前開始一個新進程。」你會知道如何實現這個?再次感謝您的幫助。 – Jake