【问题标题】:CPU (all cores) become idle during python multiprocessing on windows在 Windows 上的 python 多处理期间 CPU(所有内核)变得空闲
【发布时间】:2014-06-03 21:53:32
【问题描述】:

我的系统是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系统本身的问题还是我的程序的问题?

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

请帮忙!

【问题讨论】:

    标签: python windows powershell pandas multiprocessing


    【解决方案1】:

    我被重定向到这个问题,因为我在 Ubuntu 中使用 Python 的多处理库时遇到了类似的问题。就我而言,这些过程不是通过按 Enter 或类似的方式开始的,但是,它们会在某个时间后突然开始。我的代码是一种迭代启发式算法,它在每次迭代中都使用多处理。为了获得稳定的运行时性能,我必须在完成一些迭代后重新运行代码。由于问题是很久以前发布的,您是否遇到过它背后的实际原因和解决方案?

    【讨论】:

      【解决方案2】:

      我承认不理解 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 对象...(我认为)对象的副本被传递给每个线程,如果您执行突变,它们不会传播并且将被垃圾收集。

      您可以将多处理版本的字典或列表与 Manager 类一起使用,这对于存储每个作业的结果很有用(只需从函数内访问字典/列表):

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

      他们将拥有共享访问权限(就像您写了一个锁一样)。几乎不值得一提的是,如果您要附加到列表,那么顺序将不仅仅与 procs 相同!

      也许能够为 pandas 对象执行类似于 Manager 的操作(在不复制的情况下将锁写入内存中的对象),但我认为这将是一项不平凡的任务...

      【讨论】:

      • pool.map()没什么区别,我现在有程序在运行,所以...我想知道是不是CPU温度太高了,这是一种保护机制。我的程序中的并行本质上是将大量数据切割成小块,并且每个块都有独立的操作。最后加入他们。顺便说一句,multiprocessing 在 python 中不起作用。
      • 我编辑了原来的问题,所以现在你可以看到我的工作流程了。
      • @user3576212 你是什么意思它在 python 中不起作用?我这里的 f 是一个计算 df.sum() 10000 次的函数(所以需要几秒钟)......它基本上需要与一次相同的时间进行 4 次。
      • 您的回答实际上并没有回答我的问题。但我很感激你的努力!所以我仍然会投票给它作为正确答案。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-05-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-22
      相关资源
      最近更新 更多