我正在使用python的multiprocessing
模块来启动一些蒙特卡罗模拟,以加快计算速度。我的代码看起来像这样:
def main():
(various parameters are being set up...)
start = 0
end = 10
count = int(1e4)
time = np.linspace(start, end, num=count)
num_procs = 12
mc_iterations_per_proc = int(1e5)
mc_iterations = num_procs * mc_iterations_per_proc
mean_estimate, mean_estimate_variance = np.zeros(count), np.zeros(count)
pool = multiprocessing.Pool(num_procs)
for index, (estimate, estimate_variance) in enumerate(pool.imap_unordered(mc_linear_estimate,
((disorder_mean, intensity, wiener_std, time) for index in xrange(mc_iterations)), chunksize=mc_iterations_per_proc)):
delta = estimate - mean_estimate
mean_estimate = mean_estimate + delta / float(index + 1)
mean_estimate_variance = mean_estimate_variance + delta * (estimate - mean_estimate)
mean_estimate_variance = mean_estimate_variance / float(index)
好的,现在mc_linear_estimate
是一个带* args并在其中创建其他变量的函数。它看起来像这样:
def mc_linear_estimate(*args):
disorder_mean, intensity, wiener_std, time = args[0]
theta_process = source_process(time, intensity, disorder_mean)
xi_process = observed_process(time, theta_process, wiener_std)
gamma = error_estimate(time, intensity, wiener_std, disorder_mean)
estimate = signal_estimate(time, intensity, wiener_std, disorder_mean, gamma, xi_process)
estimate_variance = (estimate - theta_process) ** 2
return estimate, estimate_variance
正如您所看到的,迭代次数相当大(1.2M),并且所有数组的大小都是10K双倍,因此我使用Welford's algorithm来计算均值和方差,因为事实是它不需要在内存中存储所考虑序列的每个元素。但是,这没有用。
问题:我内存不足。当我启动应用程序时,会出现12个进程(在我的Linux机器上使用top
程序看到)。他们立即开始消耗大量内存,但由于我使用的Linux机器有49G的内存,一段时间情况还可以。然后,由于每个进程占用大约4G的RAM,其中一个失败并在<defunct>
中显示为top
。然后另一个进程失效,直到只剩下一个进程,最终因“Out of memory”异常而失败。
问题:
我可能做错了什么?
我怎样才能改进代码,以免消耗掉所有内存?