Python multiprocessing-Pool.map只运行一个任务(而不是多个任务)

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

我有一段代码,可以解析大量的XML文件(使用XML.sax库)来提取数据,用于将来的机器学习。我希望解析部分并行运行(我在一台服务器上有24个内核,同时也在做一些web服务,所以我决定使用其中的20个)。解析之后,我想合并结果。下面的代码应该(并且正在)完全符合我的预期,但是并行的东西有一个问题

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无序
。可能是一个小的改进,但。。。