python多处理、大数据让进程进入休眠状态

python多处理、大数据让进程进入休眠状态,python,multiprocessing,bigdata,sleep,pool,Python,Multiprocessing,Bigdata,Sleep,Pool,我正在使用python 2.7.10。 我读了很多文件,将它们存储到一个大列表中,然后尝试调用multiprocessing并将大列表传递给那些多进程,这样每个进程都可以访问这个大列表并进行一些计算 我使用的泳池是这样的: def read_match_wrapper(args): args2 = args[0] + (args[1],) read_match(*args2) pool = multiprocessing.Pool(processes=10) result=

我正在使用python 2.7.10。 我读了很多文件,将它们存储到一个大列表中,然后尝试调用multiprocessing并将大列表传递给那些多进程,这样每个进程都可以访问这个大列表并进行一些计算

我使用的泳池是这样的:

def read_match_wrapper(args):
    args2 = args[0] + (args[1],)
    read_match(*args2)

 pool = multiprocessing.Pool(processes=10)
 result=pool.map(read_match_wrapper,itertools.izip(itertools.repeat((ped_list,chr_map,combined_id_to_id,chr)),range(10)))
 pool.close()
 pool.join()
基本上,我将多个变量传递给“read_match”函数。为了使用pool.map,我编写了“read\u match\u wrapper”函数。我不需要从这些过程中得到任何结果。我只想让他们跑完

当我的数据列表“ped_list”非常小时,我可以完成整个过程。当我加载所有数据(如10G)时,它生成的所有多进程都显示为“S”,似乎根本不起作用

我不知道您可以通过池访问多少数据是否有限制?
我真的需要帮助!谢谢

来自多处理编程指南:

避免共享状态

As far as possible one should try to avoid shifting large amounts of data between processes.
你所遭受的是一个典型的症状,一个完整的管道没有得到排水

池使用的Python multiprocessing.Pipe有一些设计缺陷。它基本上是通过一个更像流对象的操作系统管道实现一种面向消息的协议

结果是,如果通过管道发送过大的对象,它将被填充。发送方将无法向其添加内容,接收方也无法将其排出,因为它在等待消息结束时被阻止

证据是,你的员工正在睡觉,等待着永远不会到来的“肥胖”信息

ped_列表是否包含文件名或文件内容


在第二种情况下,您希望发送文件名而不是内容。工作人员可以通过一个简单的open()自己检索内容。

而不是使用
池。map
我宁愿使用队列。您可以生成所需数量的进程,并为输入分配一个队列:

n = 10 #number of processes
tasks = multiprocessing.Queue()

for i in range(n): #spawn processes
    multiprocessing.Process(target = read_match_wrapper, args = tasks)
for element in ped_list:
    tasks.put(element)

这样,您的队列从一侧填满,同时从另一侧清空。在进程启动之前,可能需要在队列中放入一些内容。由于队列为空或引发队列,它们有可能结束而不执行任何操作。空异常。

读取匹配的代码是什么??能否检查
itertools.izip()
部分是否返回了正确的值?如果您的数据真的是10G,使用
repeat()
,情况可能会变得更糟,可能会消耗太多内存。是的,我认为内存是问题所在。每次它产生一个进程时,都会复制内存。而集群负担不起!我从其他帖子中注意到了这一点。我应该将ped_列表转换为multiprocessing.Array。但是我不知道怎么做,因为它是一个列表列表。multiprocessing.Array似乎只采用非常简单的格式。不管您使用什么方法来共享ped_列表,它仍然会非常慢,如果没有很好地实现,就会出现死锁。问题的真正解决方案仍然是提出的方案。不要在ped_列表中加载文件内容,只需加载文件名,让子工作人员自己加载文件即可。另一个与您的问题完全相同的问题是:在这种情况下,管道是一个真正的瓶颈,因此您会注意到一定的速度。在Unix系统上,其大小通常限制为32Mb。您想通过它填充10Gb的数据:)