1

所以我有一个非常大的矩阵(120000 x 120000),我在整个矩阵上运行一个脚本,将一个元素与其他所有元素进行比较。因为我无法将整个内容保存在内存中,所以我使用 memmap。我还定期刷新矩阵,以确保如果计算机崩溃或发生什么我不会丢失所有数据。但是,我注意到我进入矩阵的“更深”,可以说,刷新数据所需的时间增加了。最终,保存我的结果最多需要五分钟。Woudl有人知道它为什么这样做吗?有没有更好的方法可以做到这一点?我会发布一些代码,但我相当肯定我没有做任何“错误”的事情。

OUT_DIR = '/media/sf_3dAnalysis/simMatrix/'
SIM_FILE = 'similarity.npy'
data = np.lib.format.open_memmap(OUT_DIR+SIM_FILE, mode='w+', dtype='float32', shape=(120821,120821))
#After processing a certain amount of indices, I go to flush the data.
data.flush()
4

1 回答 1

0

mmap 非常适合参考位置较小的问题 - 适合 physmem 的问题。但是,听起来您正在使用 mmap 处理 53 GB 的数据,并且引用的局部性并不好。

如果您致力于 mmap,您可能不得不为此工作负载接受一些性能损失。

可能对某些人有所帮助的一件事是编写一个类,将尽可能多的矩阵保留在内存中(可能是第一行),并将其余部分放在磁盘上(其余行),未缓存(可能使用 O_DIRECT) .

在你的情况下,缓存整个东西可能只会导致虚拟内存抖动,除非你有一个非常大的 physmem。但是,如果您有预算,53+ gig 的 physmem 可能并非遥不可及。

如果您决定采用 O_DIRECT 路线,请查看: http ://stromberg.dnsalias.org/~strombrg/odirect/

于 2013-11-24T18:30:45.793 回答