在python中使用多处理时的内存消耗

时间:2013-02-05 19:56:38

标签: python memory-management multiprocessing

我正在使用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”异常而失败。

问题:

  1. 我可能做错了什么?

  2. 我怎样才能改进代码,以免消耗掉所有内存?

0 个答案:

没有答案