在Windows上的python多处理期间,CPU(所有核心)变为空闲

时间:2014-06-03 21:53:32

标签: python windows powershell pandas multiprocessing

我的系统是windows 7.我编写了python程序来进行数据分析。我使用multiprocessing库来实现并行性。当我打开windows powershell时,键入python MyScript.py。它开始使用所有的cpu核心。但过了一会儿,CPU(所有核心)都变得闲置了。但如果我在PowerShell窗口中点击Enter,则所有核心都会恢复满负荷状态。要明确的是,该程序很好,并已经过测试。这里的问题是CPU核心自行闲置。

这不仅发生在运行Windows 7 Pro的办公室计算机上,也发生在运行Windows 7 Ultimate的家用台式机上。

该程序的并行部分非常简单:

def myfunc(input):
    ##some operations based on a huge data and a small data##

    operation1: read in a piece of HugeData #query based HDF5
    operation2: some operation based on HugeData and SmallData

    return output

# read in Small data
SmallData=pd.read_csv('data.csv')

if __name__ == '__main__':
    pool = mp.Pool()
    result=pool.map_async(myfunc, a_list_of_input)
    out=result.get()

我的功能主要是使用Pandas进行数据处理。

该程序没有任何问题,因为我已经成功完成了我的程序几次。但是我必须继续观察它,并在内核空闲时点击Enter。这项工作需要几个小时,我真的不会继续观看它。

这是Windows系统本身还是我的程序的问题?

顺便说一句,所有内核都可以访问存储在内存中的相同变量吗?例如我在mydata之前将数据集if __name__ == '__main__':读入内存。此数据将在myfunc中使用。所有核心都应该能够在同一时间访问mydata,对吗?

请帮忙!

2 个答案:

答案 0 :(得分:1)

我被重定向到这个问题,因为在Ubuntu中使用Python的Multiprocessing库时遇到了类似的问题。在我的情况下,这些过程不是通过按回车键等开始的,但是它们会在一段时间后突然开始。我的代码是一种迭代启发式方法,在每个迭代中都使用多处理。我必须在完成一些迭代后重新运行代码,才能获得稳定的运行时性能。在很久以前就发布了该问题,您是否发现了其背后的实际原因以及解决方案?

答案 1 :(得分:0)

我承认不理解map_async的微妙之处,但我不确定你是否可以这样使用它(我似乎无法让它完全起作用)......

我通常使用以下方法(列表理解我想要的调用):

In [11]: procs = [multiprocessing.Process(target=f, args=()) for _ in xrange(4)]
   ....: for p in procs: p.start()
   ....: for p in procs: p.join()
   ....:

这很简单,等到作业完成后再继续。

如果没有进行修改,这对pandas对象很好用...(我认为)对象的副本会传递给每个线程,如果你执行突变,它们就不会传播并且会被垃圾回收。

您可以将多处理版本的dict或list与Manager类一起使用,这对于存储每个作业的结果非常有用(只需从函数中访问dict / list):

mgr = multiproccessing.Manager()
d = mgr.dict()
L = mgr.list()

他们将拥有共享访问权限(就像你写了一个锁)。这几乎不值得一提,如果你要附加一个列表,那么订单将不再与procs相同!

可能能够为管理程序执行与pandas对象类似的操作(在不复制的情况下将锁写入内存中的对象),但我认为这将是一项非常重要的任务...

相关问题