【发布时间】:2017-12-21 07:46:42
【问题描述】:
假设我在磁盘上保存了一些大矩阵。将它全部存储在内存中是不可行的,所以我使用 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() 不保留对其接收到的数组的任何引用,因此在这方面没有“内存泄漏”
谢谢
【问题讨论】:
-
试试flush,也许会有帮助。
-
@yar 我会尝试,但听起来很奇怪,毕竟我的 memmap 是只读的,所以刷新应该没有任何效果
-
@yar 刷新不起作用。 RSS 内存使用保持不变
-
您在 Windows 上吗?我在 Windows 上遇到了同样的问题,在 Linux 上一切都按预期工作(缓存由操作系统完成,而不是由 python 解释器完成)。您是否也可以使用 HDF5 (h5py)?
-
@max9111 我在 linux 上(确切地说是 Debian GNU/Linux 8 (jessie) 64 位),不确定 HDF5 是什么。我会调查的
标签: python numpy numpy-memmap