我有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>