我编写了以下代码以使我的第二个懒惰的 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)