Python multiprocessing-Pool.map只运行一个任务(而不是多个任务)
我有一段代码,可以解析大量的XML文件(使用XML.sax库)来提取数据,用于将来的机器学习。我希望解析部分并行运行(我在一台服务器上有24个内核,同时也在做一些web服务,所以我决定使用其中的20个)。解析之后,我想合并结果。下面的代码应该(并且正在)完全符合我的预期,但是并行的东西有一个问题Python multiprocessing-Pool.map只运行一个任务(而不是多个任务),python,xml,multiprocessing,pool,Python,Xml,Multiprocessing,Pool,我有一段代码,可以解析大量的XML文件(使用XML.sax库)来提取数据,用于将来的机器学习。我希望解析部分并行运行(我在一台服务器上有24个内核,同时也在做一些web服务,所以我决定使用其中的20个)。解析之后,我想合并结果。下面的代码应该(并且正在)完全符合我的预期,但是并行的东西有一个问题 def runParse(fname): parser = make_parser() handler = MyXMLHandler() parser.setContentHan
def runParse(fname):
parser = make_parser()
handler = MyXMLHandler()
parser.setContentHandler(handler)
parser.parse(fname)
return handler.getResult()
def makeData(flist, tasks=20):
pool = Pool(processes=tasks)
tmp = pool.map(runParse, flist)
for result in tmp:
# and here the merging part
当这个部件启动时,它在20个核上运行一段时间,然后只运行一个核,它发生在合并部件之前(当然,合并部件只在一个核上运行)
有没有人能帮助解决这个问题,或者建议一种加速程序的方法
谢谢
ppiikkaaa为什么你说在完成之前只有一个 您正在使用
.map()
来收集结果,然后返回。
因此,对于大型数据集,您可能处于收集阶段
您可以尝试使用.imap()
这是.map()
上的迭代器版本,如果分析顺序不重要(从您的示例中可以看出),甚至可以使用.imap\u unordered()
这是相关的文件。
值得注意的是:
在很长的时间内,使用较大的chunksize值的iterables比使用默认值1完成作业的速度要快得多
非常感谢。现在我使用的是大chunksize的imap,但它并没有加快处理速度。收集阶段比处理收集的数据花费的时间要长得多(这不是小事)。你知道为什么要花这么长时间吗?收集当然是一个过程,所以它可能取决于需要收集的结果的大小。您正在执行mapreduce任务,因此其中一个关键点是优化reduce部分。如果您还可以尝试
.imap\u无序
。可能是一个小的改进,但。。。