假设我在磁盘上保存了一些大矩阵。将它全部存储在内存中并不可行,所以我使用 memmap 来访问它
A = np.memmap(filename, dtype='float32', mode='r', shape=(3000000,162))
现在假设我想迭代这个矩阵(本质上不是以有序的方式),这样每一行都将被访问一次。
p = some_permutation_of_0_to_2999999()
我想做这样的事情:
start = 0
end = 3000000
num_rows_to_load_at_once = some_size_that_will_fit_in_memory()
while start < end:
indices_to_access = p[start:start+num_rows_to_load_at_once]
do_stuff_with(A[indices_to_access, :])
start = min(end, start+num_rows_to_load_at_once)
随着这个过程在我的计算机上进行,我的计算机变得越来越慢,并且我的 RAM 和虚拟内存使用量呈爆炸式增长。
有没有办法强制 np.memmap 使用一定数量的内存?(我知道我需要的行数不会超过我计划一次读取的行数,并且缓存不会真正帮助我,因为我只访问每一行一次)
也许相反,是否有其他方法可以按自定义顺序在 np 数组上进行迭代(类似生成器)?我可以使用 file.seek 手动编写它,但它恰好比 np.memmap 实现慢得多
do_stuff_with() 不保留对其接收到的数组的任何引用,因此在这方面没有“内存泄漏”
谢谢