我正在开发31个可用的Go of RAM,12核Linux KUbuntu计算机。 我生成了计算4维(x,y,z,t)函数的模拟。 我将我的维度定义为我numpy.meshgrid使用的数组。因此,对于每个时间点,我计算每个点x,y,z的结果。它来自繁重的数据计算。
首先,我学会了如何仅使用一个核心。它的效果很好,无论我的盒子是什么大小的#34; (x,y,z)。由于我使用傅里叶变换工作了很多,我将x,y,z,t定义为2:64,128,256的幂,... 我可以毫不费力地去x = y = z = t = 512,即使它花了很多时间来运行它(这是有道理的)。当我这样做时,我使用计算机可用RAM的大约20-30%。大。
然后我想使用更多内核。所以我实现了这段代码:
import multiprocessing as mp
pool = mp.Pool(processes=8)
results = [pool.apply_async(conv_green, args=(tstep, S_, )) for tstep in t]
所以在这里我要求我的脚本使用8个核心,并将我的结果定义为使用函数" conv_green"与args" tstep,S _"一直以来。
它工作得很好,按预期使用8个核心但是我不能再运行使用等于或大于512的数字的x,y,z,t的模拟。
这就是我的问题所在。从技术上讲,从单核心系统切换到多个chanegd没有任何东西到我的计算例程。我不明白为什么我有足够的RAM用于512 ...在单核中以及为什么,当我切换到多核时,计算机甚至不想启动它(并且错误发生在" results = pool .apply ..." line)
所以,如果你们知道这是如何工作的,为什么我会得到这个" treshold",谢谢你帮我解决了!
最好的问候。
PS:这是在多核中崩溃时突然出现的错误:
追踪(最近一次通话): 文件"",第1行,
文件" /usr/lib/python2.7/dist package / spyderlib / widgets / externalshell / sitecustomize.py",第540行,在runfile中 execfile(filename,namespace)
File" / home / alexis / Heat / Simu/Lecture Propre / Test Tkinter / Simulation N spot SCAN Tkinter.py",280行in XYslice = array([p.get()[0] for p in results])
文件" /usr/lib/python2.7/multiprocessing/pool.py" ;,第558行,获取 提升self._value
SystemError:PyObject_Call
中没有错误的NULL结果答案 0 :(得分:1)
对于任何语言的多处理,每个线程都需要私有存储,它可以写入,而不受其他线程的干扰。一旦干扰成为可能,就必须锁定数据结构,(在最坏的情况下)将我们带回单线程。
似乎正在为每个线程复制大型数据结构,当你有8个处理器时,有效地将你的内存使用量乘以8 ......或者高达可用内存的200%。
最好的解决方案是防止不必要的复制。
如果这不可行,那么你所能做的就是限制它可以运行的处理器数量,你的实例中有四个应该可以,但要确保你的机器有很多交换空间。交换空间还为您提供了一些允许虚拟内存超过物理RAM的游戏,如果"工作集"足够小,只要有足够的交换,你就可以显着超过你的物理RAM。