gpt4 book ai didi

python-3.x - 当对象较大时pool.map卡住

转载 作者:行者123 更新时间:2023-12-04 14:54:12 29 4
gpt4 key购买 nike

我正在使用pool.map填充字典-称为节点。需要明确的是:该字典是在pool.map运行之后填充的,因此不必担心在进程之间共享变量。函数返回的所有内容以及字典中的所有内容都是可分析的。它正在填充实质上是图的字典。当我深入1、2、3来填充此图形时,程序将完美运行。但是在4点深处:该程序似乎没有崩溃,而只是死机了。我在要映射的函数中设置了打印语句,并在其运行结束时将其打印在程序的最顶部,然后卡住。这是我如何调用pool.map:

    currentNode = startingNode
nodesPopulated = [currentNode]
connections = []
merger = []
pool = Pool(cpu_count())
for currentDepth in range(1, depth):
print('=' * 70)
print("= At depth", currentDepth)
connections = []
for item in nodesPopulated:
if item != None:
if item.isPopulated():
connections +=list(item.getConnections().values())
print("= Current number of connections:",len(connections))
print("= Current number of NodesPopulated in this iteration: ",len(nodesPopulated))
print("= Total number of nodes",len(self.nodes.keys()))
nodesPopulated = pool.map(self.populateTopicNode, connections)
print('\n= Successfully populated another round of nodes')
for node in nodesPopulated:
if node != None:
if item.isPopulated():
self.nodes[node.getTopic().getName()] = node
#self.populatedNodes[node.getTopic().getName()] = True;
print('= Updated self.nodes\n')

pool.close()
pool.join()

print('\nCount = ',len(list(self.nodes.keys())))
return

再一次,我确保返回到nodesPopulated的所有内容都是可腌制的。我不知所措,因为深入运行此程序4大约需要2个小时,而没有pool.map的话,它可以正常工作,但大约需要6个小时。我不想抛弃多处理程序,但是我无法弄清楚这一点,并且它需要永远进行调试。它在卡住之前打印的最后一件事是'D',它位于self.populateTopicNode的顶部。我还认为变得太大的对象(self.nodes和connections)可能是卡住的原因。

笔记:
我确定这是一个多处理问题,因为我不使用pool.map来运行此确切的代码,而是将其替换为for循环,并且运行到完成而没有错误。因此,导致pool.map卡住。在函数的第一个引用处没有错误消息挂起。以下是“populateTopicNode”的前几行:
def populateTopicNode(self, node: TopicNode):
print('D')
if(node.isPopulated()):
return None

卡住前在控制台上看到的最后一件事是“D”

编辑:
我做了一些测试,以给您确切的挂起时间:
enter image description here

并且挂起了大约1300 mb的内存。

编辑2:

好的,所以我发现它返回的不仅仅是随机挂起的东西。它返回None,然后挂起。我不确定为什么会这样,因为很多时候它返回None并可以正常工作。我还尝试包装了函数,除了查看是否将异常返回给父对象外,这也不是问题。没有异常被捕获,它正在运行直至返回。它只是在返回后挂起。

编辑3:

每次迭代都会在相同的精确位置中断。我打印正在处理的当前Topic的名称,它总是在同一行的同一位置中断,然后挂起。我不确定这是否有帮助,但这只是其他信息。始终在同一确切时间中断。

最佳答案

根据multiprocessing准则。

As far as possible one should try to avoid shifting large amounts of data between processes.


multiprocessing.Pool依赖于锁定的缓冲区(OS管道)在工作程序之间分配任务并检索其结果。如果将大于缓冲区的对象插入管道,则逻辑可能会挂起。

我建议您将作业转储到文件中(例如,使用 pickle),然后将文件名发送给子进程。这样,每个进程都可以独立检索数据。不仅可以防止逻辑卡住,而且可以注意到速度提高,并且管道成为设计中的严重瓶颈。

关于python-3.x - 当对象较大时pool.map卡住,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51541336/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com