遅延した 2 番目の CPU コアを機能させるために、次のコードを記述しました。コードが基本的に行うことは、最初にディレクトリ階層で目的の「sea」ファイルを見つけ、後で外部スクリプトのセットを実行してこれらのバイナリ「sea」ファイルを処理し、50 から 100 個のテキスト ファイルとバイナリ ファイルを生成することです。質問のタイトルが示すように、処理速度を向上させるために並行して実行します。
この質問は、「 ipcluster を起動できません」というタイトルの IPython ユーザー リストでの長い議論に由来しています。IPython の並列処理機能に関する私の実験から始めます。
問題は、このコードを正しく実行できないことです。「sea」ファイルを含むフォルダに「sea」ファイルのみが格納されている場合、スクリプトは外部スクリプトの実行を完全に実行せずに実行を終了します。(実行する外部スクリプトが 30 ~ 50 あるとしますが、マルチプロセッシングが有効なスクリプトは、これらの外部スクリプト チェーンの最初のスクリプトを実行した後にのみ枯渇します。) 興味深いことに、このスクリプトを既に処理されたフォルダー ("sea" ファイル) で実行すると、事前に処理されており、出力ファイルがそのフォルダーに既にある)、実行すると実行されますが、今回はリニアな処理タイミングに対して約 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)