python多处理,大数据使进程进入休眠状态

2024-05-26 21:54:07 发布

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

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

我用的是这样的泳池:

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”函数。为了使用池.map,我编写了“read_match_wrapper”函数。我不需要这些过程的任何结果。我只想让他们跑完全程。在

当我的数据列表“ped_list”很小时,我就可以完成整个过程的工作。当我加载所有数据时,比如10G,那么它生成的所有多进程都会显示“S”,而且似乎根本不起作用。。在

我不知道通过池访问的数据量是否有限制? 我真的需要帮助!谢谢!在


Tags: 函数idmap列表read进程matchargs
2条回答

根据多处理编程指南:

Avoid shared state

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

你所遭受的是一个典型的症状,一个充满的管道,没有排水。在

Python多处理.管道游泳池使用的有一些设计缺陷。它基本上在一个操作系统管道上实现了一种面向消息的协议,更像是一个流对象。在

结果是,如果你把一个太大的物体通过管道,它就会被塞住。发送方将无法向其添加内容,接收方也无法将其排出,因为它在等待消息结束时被阻止。在

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

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)

这样,您的队列将从一侧填充,同时从另一侧清空。在进程开始之前,可能有必要在队列中放入一些东西。当队列为空或引发一个队列.empty-例外情况。在

相关问题 更多 >

    热门问题