2

我有一个代码可以解析大量 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 个核心上运行一段时间,然后只运行一个,它发生在合并部分之前(当然,它只会在一个核心上运行)。

任何人都可以帮助解决这个问题或提出一种加速程序的方法吗?

谢谢!

呸呸呸

4

1 回答 1

1

你为什么说它在完成之前只有一个?

您正在使用.map()which 收集结果然后返回。因此,对于大型数据集,您可能会陷入收集阶段。

您可以尝试使用.imap()which 是迭代器版本,.map()或者.imap_unordered()如果分析顺序不重要(从您的示例中可以看出)。

是相关文档。值得注意的是:

对于很长的迭代,使用较大的 chunksize 值可以使作业完成比使用默认值 1 快得多

于 2013-09-11T16:31:06.273 回答