我有一个存储为 NumPy 内存映射的大型 (75000 x 5 x 6000) 3D 数组。如果我像这样简单地迭代第一个维度:
import numpy as np
import time
a = np.memmap(r"S:\bin\Preprocessed\mtb.dat", dtype='float32', mode='r', shape=(75000, 5, 6000))
l = []
start = time.time()
index = np.arange(75000)
np.random.shuffle(index)
for i in np.array(index):
l.append(np.array(a[i]) * 0.7)
print(time.time() - start)
>>> 0.503
迭代发生得非常快。但是,当我尝试在更大程序的上下文中迭代同一个 memmap 时,对 memmap 的单独调用将花费多达 0.1 秒,而提取所有 75000 条记录将花费近 10 分钟。
较大的程序太长无法在这里重现,所以我的问题是:是否有任何已知问题会导致 memmap 访问显着减慢,也许如果 Python 内存中保存了大量数据?
在较大的程序中,用法如下所示:
import time
array = np.memmap(self.path, dtype='float32', mode='r', shape=self.shape)
for i, (scenario_id, area) in enumerate(self.scenario_areas):
address = scenario_matrix.lookup.get(scenario_id)
if address:
scenario_output = array[address]
output_total = scenario_output * float(area)
cumulative += output_total # Add results to cumulative total
contributions[int(scenario_id.split("cdl")[1])] = output_total[:2].sum()
del array
第二个示例需要 10 多分钟才能执行。对线场景输出 = array[address]的计时,它只是从 memmap 中提取记录,在 0.0 和 0.5 之间变化 -提取一条记录需要半秒。