我的系统是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
,对吗?
请帮忙!
答案 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对象类似的操作(在不复制的情况下将锁写入内存中的对象),但我认为这将是一项非常重要的任务... 的