Python进程被大参数阻塞

时间:2018-12-22 22:35:38

标签: python multiprocessing

我正在使用apply_async()如下处理python脚本:

def my_proc(df, id):
   # do something
   return df

df = pd.read_csv(myfile, sep='\t', header=0, dtype=object)
p = multiprocessing.Pool(50)
ids = df['id'].tolist()
for i in range(len(ids))
    result[id] = p.apply_async(my_proc, [df, ids[i]])

我遇到的问题是,如果数据帧大小变得非常大(200K行,75列),在任何给定时间仅运行一个进程,而其他所有进程均处于睡眠模式。

如果我将数据帧保存到一个csv文件中,并将csv文件名作为参数传递,并打开进程并读取csv,我会看到现在所有进程都保持运行,但是由于所有进程(其中50个进程)的性能变得不可接受)竞争打开相同的大型csv文件。

任何人都可以告诉我如何找出这些进程为何以及在何处被阻止。对替代性能解决方案有何建议?

编辑:

我正在使用Linux服务器。 我试图在下面的队列中传递df,但结果相同。我还返回了None并将进程数更改为3以找出问题所在:

def my_proc(q, id):
    df = q.get()
    # do something
    return **None**

p = multiprocessing.Pool(**3**)
m = multiprocessing.Manager()
q = m.Queue()
df = pd.read_csv(report_file_dups, sep='\t', header=0, dtype=object)
q.put(df)
ids = df['id'].tolist()
for i in range(len(ids))
    result[id] = p.apply_async(my_proc, [q, ids[i]])

我是否按预期使用队列?

1 个答案:

答案 0 :(得分:0)

将文件送入队列,逐行读取并让工作人员使用队列中的数据怎么办?