1

我正在使用 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 算法来计算均值和方差,因为它不需要存储内存中考虑的序列的每个元素。但是,这无济于事。

问题:我的内存不足。当我启动应用程序时,出现了 12 个进程(如top在我的 Linux 机器上使用程序所见)。它们立即开始消耗大量内存,但由于我使用的 Linux 机器有 49G 的 RAM,所以一段时间内一切正常。然后,由于每个进程占用大约 4G 的 RAM,其中一个进程失败并显示<defunct>top. 然后另一个进程脱落,直到只剩下一个进程,最终失败并出现“内存不足”异常。

问题:

  1. 我可能做错了什么?

  2. 我怎样才能改进代码,使其不会消耗所有内存?

4

0 回答 0