引导时出现RAM瓶颈-代码是否可以优化?

时间:2019-05-14 14:02:54

标签: python numpy statistics-bootstrap

我有1000名患者。我已经为每个患者预先计算了(100x100x1000)numpy网格,即大约1000万个数据点。 基本上,我需要做的是获取每个患者网格的第一个数据点(第一个索引),并对其求和,然后进行第二个等。因此,只需对所有患者整个网格的每个数据点求和。原则上应该返回一个(100x100x1000)网格,其中包含所有患者的所有求和值。

但是,我的问题是每个预先计算的网格大约为35 MB。因此,如果有成千上万个存储空间,那么将它们存储在内存中大约需要35 GB,而我目前还没有。

所以我现在要做的是一次重新加载一个网格,然后“保存”每个网格的总和,所以我一次只能打开两个网格。我这样做:

patients = np.linspace(0, 1000, 1000)

def sum_iter(values, index_list):
    sum_ = np.zeros((100, 100, 1000), dtype=int)
    generator_index = -1

    for index in index_list:
        try:
            while generator_index < index:
                vector = next(values)
                generator_index = generator_index + 1
            sum_ = (sum_ + vector)
        except StopIteration:
            print("Done")

    return sum_

for t in range(1, 1000):
    print("Bootstrap sequence: {}".format(t))

    ### random sampling with replacement ###
    patients_boot = np.random.choice(patients, size=patients.shape, replace=True)  

    log_values = (np.load("data/{}/grid.npy".format(patient)) for patient in patients)

    log_likely_final = sum_iter(log_values, patients)

...然后在代码的最后一行之后发生了一些事情,但这很快,并且我认为在这种情况下没关系。

这可行。但是,如果网格与现在一样大,则需要一些时间。每次迭代大约需要1-2分钟。但我也希望进行一些引导,如代码所示。但是您可以想象,做1000次重新采样,好了,这是1000-2000分钟,这是相当长的时间tbh。

我不知道是否可以通过某种方式对其进行优化,因此计算时间并不那么糟糕。到现在为止,每次重新采样时,每次都会重新加载每个单个网格。可能有人可以这样做,所以我加载了x数的网格,直到RAM被填满(或接近),使用它,保存它,然后重新加载下一个x数,直到RAM再次变满,依此类推。 / p>

0 个答案:

没有答案