Python多处理池.map只运行一个任务(而不是多个任务)

2024-10-03 13:22:48 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一段代码可以解析大量的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公司


Tags: 文件代码parser核心defxmlfnametmp
1条回答
网友
1楼 · 发布于 2024-10-03 13:22:48

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

您使用的是.map(),它收集结果然后返回。 所以对于大型数据集,你可能还停留在收集阶段。在

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

Here是相关文档。 值得一提的是:

For very long iterables using a large value for chunksize can make the job complete much faster than using the default value of 1.

相关问题 更多 >