使用池的Python多进程在AWS Ubuntu上失败

2024-09-30 19:21:16 发布

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

我有一个简单的字符串匹配脚本,在我的本地mac上,有4个内核,可以测试多达8个池工作器的多处理。然而,在一个拥有8个内核的awsc1.xlarge上,相同的脚本通常会杀死除2个以外的所有工作人员,CPU仅能在25%的速度下工作,几轮后以MemoryError停止。在

我不太熟悉服务器配置,所以我想知道是否有任何设置需要调整?在

池实现如下所示,但似乎不是问题,因为它在本地工作。每个工人都会有几千个目标,而且不会超过前五个目标。如果需要的话,很乐意分享更多的代码。在

pool = Pool(processes = numProcesses)
totalTargets = len(getTargets('all'))
targetsPerBatch = totalTargets / numProcesses
pool.map_async(runMatch, itertools.izip(itertools.repeat(targetsPerBatch), xrange(0, totalTargets, targetsPerBatch))).get(99999999)
pool.close()
pool.join()

Tags: 字符串脚本目标maccpu内核poolitertools
1条回答
网友
1楼 · 发布于 2024-09-30 19:21:16

MemoryError表示系统范围内的虚拟内存不足。你有多少虚拟内存是一个抽象的东西,基于实际的物理RAM加上交换文件的大小加上从其他文件分页到内存中的东西,还有那些因为操作系统很聪明而没有被分页的东西等等。在

根据您的评论,每个进程的平均实际内存为0.75GB,虚拟内存为4GB。所以,你的虚拟机总使用量是32GB。在

其中一个常见的原因是,每个进程可能在4GB时达到峰值,但几乎所有的时间都在使用比这个低得多的时间。Python很少向操作系统释放内存;它只会被调出页面。在

无论如何,6GB的实际内存在8GB的Mac或7GB的c1.xlarge实例上是没有问题的。在

32GB的虚拟机在Mac上也没问题。一个典型的OS X系统实际上有无限的虚拟机大小如果你真的尝试使用所有的虚拟机,它会自动创建更多的交换空间,像疯了一样分页,减慢你的系统爬网和/或磁盘空间不足,但在这种情况下这不会影响你。在

但是32GB的虚拟机在linux上可能是个问题。典型的linux系统具有固定大小的交换,并且不允许您将VM推到它可以处理的范围之外。(它有一个不同的技巧,可以首先避免创建可能不必要的页面…但是一旦创建了页面,就必须为它们留出空间。)我不确定xlarge配置了什么,但是^{}工具将告诉您您有多少交换(以及您使用了多少)。在

总之,简单的解决方案是在xlarge上创建并启用一个额外的32GB交换文件。在

然而,一个更好的解决方案是减少VM的使用。通常每个子进程都在执行大量的设置工作,这些工作将创建不再需要的中间数据;您可以使用multiprocessing将该设置推送到不同的进程中,这些进程一完成就退出,从而释放虚拟机。或者,您可以找到一种方法来更懒惰地进行处理,以避免首先需要所有中间数据。在

相关问题 更多 >