python多处理子进程 - 高VIRT使用导致内存错误

时间:2017-06-23 08:18:06

标签: python python-2.7 multiprocessing python-multiprocessing

我在多处理中使用pool.map来执行自定义函数,

def my_func(data): #This is just a dummy function.
   data = data.assign(new_col = data.apply(lambda x: f(x), axis = 1))
   return data

def main():
    mypool=pool.Pool(processes=16,maxtasksperchild=100)
    ret_list=mypool.map(my_func,(group for name, group in gpd))
    mypool.close()
    mypool.join()
    result = pd.concat(ret_list, axis=0)

这里gpd是一个分组的数据框,所以我一次将一个数据帧传递给pool.map函数。我一直在这里得到记忆错误。

enter image description here

从这里我可以看到,VIRT增加到多倍并导致此错误。

两个问题,

  1. 如何在VIRT解决这个关键日益增长的内存问题?可能是一种在这里玩块大小的方法。?
  2. 第二件事,虽然它启动了我在池(进程)中提到的许多python子进程,但我可以看到所有的CPU都没有达到100%的CPU,似乎它没有使用所有进程。一次运行一两个?可能是因为它在我每次传递的不同数据帧大小上应用相同的块大小(某些数据帧会很小)?我如何利用每个CPU进程?

1 个答案:

答案 0 :(得分:0)

仅适用于将来寻找答案的人。我通过使用imap而不是map来解决这个问题。因为map会列出一个密集的迭代器列表。