python多处理,大数据将进程转变为睡眠状态

ode*_*eya 6 python sleep pool multiprocessing bigdata

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

我正在使用像这样的Pool:

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()
Run Code Online (Sandbox Code Playgroud)

基本上,我将多个变量传递给'read_match'函数.为了使用pool.map,我编写了'read_match_wrapper'函数.我不需要从这些过程中获得任何结果.我只是想让他们跑步和完成.

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

我不知道你可以通过池访问多少数据?我真的需要帮助!谢谢!

nox*_*fox 5

从多处理编程指南:

避免共享状态

As far as possible one should try to avoid shifting large amounts of data between processes.
Run Code Online (Sandbox Code Playgroud)

你遭受的是一个完整的管道的典型症状,它不会被排干。

Pool 使用的 Python multiprocessing.Pipe 存在一些设计缺陷。它基本上在 OS 管道上实现了一种面向消息的协议,更像是一个流对象。

结果是,如果你通过管道发送一个太大的对象,它就会被塞满。发送方将无法向其添加内容,接收方也无法清除它,因为它被阻止等待消息结束。

证明是您的工作人员正在睡觉,等待永远不会到达的“胖”消息。

ped_list 是包含文件名还是文件内容?

在第二种情况下,您宁愿发送文件名而不是内容。工作人员可以使用简单的 open() 自己检索内容。