我編寫了以下代碼,以使我的第二個CPU內核工作。代碼的基本功能是首先在目錄層次結構中查找所需的「海洋」文件,然後執行一組外部腳本來處理這些二進制「海洋」文件,從而生成數量爲50到100的文本和二進制文件。正如問題的標題所提示的,以提高處理速度的並行方式。使用工作人員的多處理池
這個問題來源於我們在IPython用戶名單上以「Cannot start ipcluster」爲名的長篇討論。從我對IPython並行處理功能的實驗開始。
問題是我不能讓這段代碼正確運行。如果包含「海」文件的文件夾僅包含「海」文件,腳本將在未完全執行外部腳本運行的情況下完成其執行。 (假設我有30-50個外部腳本可以運行,但是隻有在執行這些外部腳本鏈中的第一個腳本後,我的啓用多處理的腳本纔會耗盡。)有趣的是,如果我在已處理的文件夾(即「海」預處理和輸出文件已經在該文件夾中),然後運行,但是這次我得到的線性處理時間約2.4到2.7倍的加速。這是不是很期待,因爲我的筆記本電腦只有一個Core 2 Duo 2.5 Ghz CPU。雖然我有一個CUDA驅動的GPU,但它與我目前的並行計算鬥爭無關:)
您認爲這可能是這個問題的根源嗎?
謝謝你的所有意見和建議。
#!/usr/bin/env python
from multiprocessing import Pool
from subprocess import call
import os
def find_sea_files():
file_list, path_list = [], []
init = os.getcwd()
for root, dirs, files in os.walk('.'):
dirs.sort()
for file in files:
if file.endswith('.sea'):
file_list.append(file)
os.chdir(root)
path_list.append(os.getcwd())
os.chdir(init)
return file_list, path_list
def process_all(pf):
os.chdir(pf[0])
call(['postprocessing_saudi', pf[1]])
if __name__ == '__main__':
pool = Pool(processes=2) # start 2 worker processes
files, paths = find_sea_files()
pathfile = [[paths[i],files[i]] for i in range(len(files))]
pool.map(process_all, pathfile)
與其說頂部外部腳本,當我嘗試調用子腳本是postprocessing_saudi的一部分,即process_raw和執行我得到一個神祕的錯誤: 以下僅僅是一個錯誤的一部分。如圖所示,IDL執行困惑,無法獲得正確的結果。 [gsever @ ccn partest] $ python proall3.py PID:17722 PID:17723 IDL版本7.1(linux x86 m32)。 (c)2009年,ITT視覺信息解決方案 IDL版本7.1(linux x86 m32)。 (c)2009年,ITT視覺信息解決方案 %無法獲取文件狀態。單位:0,文件: 錯誤的文件描述符 –
2009-12-26 00:44:39