我感兴趣的是解决一个大规模的并行问题,其中每个条件都不相互依赖。
def f(x):
return x*x - x
然后我想把所有的结果总结一下。
if __name__ == '__main__':
with Pool(4) as p:
res = list(p.imap(f, list(range(100000))))
v = np.sum(np.array(res))
# print(res)
print(v)
这段代码看起来运行良好。
现在,我想用一个函数来调用scipy
的solve_ivp
例程,而不是f(x)
。
有谁知道这个例程在使用multiprocessing
时有没有问题?
就像解一个ODE 100万次?
我没有发现任何关于multiprocessing
或scipy
的官方文档报告使用另一个库。由于我不熟悉并行编程,我不知道我是否应该意识到一些事情。
如果我这样做:
import numpy as np
from multiprocessing import Pool
from scipy.integrate import solve_ivp
def f(t, y): return -0.5 * y
def sol(x0):
sol = solve_ivp(f, [0, 10], [x0], t_eval = np.linspace(0,10, 10000) )
return sol.y
if __name__ == '__main__':
with Pool(4) as p:
res = list(p.imap(sol, list(range(1000))))
v = np.sum(np.array(res), axis=0)
print(res[-1][0])
print(len(res[-1][0]))
# print(v)
这个运行起来没有问题。是这样吗?(Plug and Play)。
多处理如何知道分配多少内存,我如何跟踪它?scipy
/numpy
中的例程是并行/多线程的,不是吗?在这种情况下,multiprocessing
是否能够处理资源分配?
如果内存消耗太多(因为res
变量存储并行处理的每个结果),我可以减少每个处理器(池)能够处理的数据量吗?
问候
1条答案
按热度按时间ui7jx7zq1#
solve_ivp
函数的实现是正确的。Scipy和numpy只实现了使用并行原语see here的非常特定的函数。所有其他并行计算都必须手动实现。内存分配确实很棘手。使用
Pool
需要将列表分解成块。池中的每个处理器都会得到一个块,它仍然是输入列表的部分副本。但是,如果初始列表已经填满了所有内存,则此任务失败。你实际上需要大约3倍于初始列表的内存-第一个块用于初始列表,第二个块用于Pool
中的部分,第三个块用于结果。一个更优化内存的解决方案需要更多的手工操作。它使用队列,通过限制队列的大小,您可以控制第二个块的大小。第一和第三块仍然需要。