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

2019-10-18 14:55发布

我有一个解析的XML文件(使用xml.sax库)中提取为未来学习机的数据相当大的量的代码。 我想解析部分以并行方式运行(我有一台服务器也做了一些网络服务的24个核心,所以我决定用其中的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

Answer 1:

为什么这么说呢它去只有一个完成之前?

您正在使用.map()负责收集结果,然后返回。 因此,对于大型数据集可能你停留在采集阶段。

您可以尝试使用.imap()这是对迭代版本.map()甚至.imap_unordered()如果分析的顺序并不重要(因为它从你的例子似乎)。

这里的相关文件。 值得注意的线路:

对于使用CHUNKSIZE一个较大的值可以使工作完全不是使用默认值1 快得多很长iterables。



文章来源: Python multiprocessing - Pool.map running only one task (instead of multiple)