繁体   English   中英

python多处理,大数据将过程转变为睡眠

[英]python multiprocessing, big data turn process into sleep

我正在使用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()

基本上,我将多个变量传递给“ read_match”函数。 为了使用pool.map,我编写了“ read_match_wrapper”函数。 这些过程都不需要任何结果。 我只希望他们运行并完成。

当我的数据列表“ ped_list”很小时,我可以完成整个过程。 当我加载所有数据(例如10G)时,它生成的所有多进程都显示为“ S”,并且似乎根本无法正常工作。

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

根据多处理编程准则:

避免共享状态

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

您所遭受的是管道不满的典型症状。

Pool使用的Python multiprocessing.Pipe具有一些设计缺陷。 它基本上在OS管道上实现了一种类似于消息的协议,这更像是流对象。

结果是,如果通过管道发送太大的对象,则该对象将被塞满。 发送者将无法向其中添加内容,而接收者将无法耗尽其内容,因为它已被阻止等待消息的结尾。

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

ped_list是否包含文件名或文件内容?

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

与其使用pool.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)

这样,您的队列将从一侧填充,同时又从另一侧清空。 可能有必要在进程启动之前将某些内容放入队列中。 由于队列为空或引发Queue.empty-exception,它们有可能不做任何事情而结束。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM