我编写了以下代码以使我的第二个懒惰的CPU核心工作。该代码的基本功能是首先在目录层次结构中查找所需的"sea"文件,然后执行一组外部脚本来处理这些二进制"sea"文件,以生成数量在50到100之间的文本和二进制文件。如问题标题所示,以并行方式增加处理速度。
这个问题起源于我们在IPython用户列表上进行的长时间讨论,标题为"Cannot start ipcluster"。从我的IPython并行处理功能实验开始。
问题在于我无法正确运行此代码。如果包含"sea"文件的文件夹只包含"sea"文件,则脚本在不完全执行外部脚本运行的情况下完成其执行。(假设我有30-50个要运行的外部脚本,但我的多处理启用的脚本仅在执行这些外部脚本链中的第一个脚本后耗尽。)有趣的是,如果我在已经处理过的文件夹上运行此脚本(即"sea"文件已经被处理并且输出文件已经在该文件夹中),那么它会运行,但这一次我得到的速度提升约为线性处理时间的2.4到2.7倍。这并不是很预期,因为我的笔记本电脑只有一个Core 2 Duo 2.5 GHz的CPU。虽然我有一个CUDA加速的GPU,但它与我的当前并行计算斗争无关 :)
您认为这个问题的根源是什么?
感谢所有的评论和建议。
这个问题起源于我们在IPython用户列表上进行的长时间讨论,标题为"Cannot start ipcluster"。从我的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)