numpy数组的内存映射文件

6
我需要读取一个巨大的numpy数组存储在内存映射文件中,处理数据并重复执行另一个部分的数组。整个numpy数组占用大约50GB空间,而我的机器只有8GB的RAM。
我最初使用numpy.memmap创建了内存映射文件,通过读取许多较小的文件并处理它们的数据,然后将处理过的数据写入memmap文件。在创建memmap文件过程中,我没有遇到任何内存问题(我定期使用memmap.flush())。这是我创建内存映射文件的方法:
mmapData = np.memmap(mmapFile,mode='w+', shape=(large_no1,large_no2))
for i1 in np.arange(numFiles):
   auxData = load_data_from(file[i1])
   mmapData[i1,:] = auxData
   mmapData.flush() % Do this every 10 iterations or so

然而,当我尝试访问小于10 MB的memmap文件时,创建memmap对象时会导致整个内存泛滥。机器明显变慢,我无法做任何事情。这是我尝试从内存映射文件中读取数据的方法:

mmapData = np.memmap(mmapFile, mode='r',shape=(large_no1,large_no2))
aux1 = mmapData[5,1:1e7]

我认为使用mmap或numpy.memmap应该可以让我访问巨大数组的部分,而不需要试图将整个数组加载到内存中。我错过了什么吗?

我是否使用了错误的工具来访问存储在磁盘上的大型numpy数组(> 20 GB)的部分?


我还没有复现它,但这对我来说似乎也很惊奇。我以为切片只是胖指针...你确定执行没有超过aux1赋值吗?如果它超过了赋值,并且你正在读取它,由于缓存行比5字节(通常为64字节)更大,具体取决于您是否使用order ='C'或'F',将加载更多的内存。但这仍然不足以使具有8GB可用RAM的机器崩溃,因此这不是一个答案。 - Andrew Wagner
1个回答

1
你是否在查看虚拟内存而非物理内存的消耗情况?减速可能来自其他原因。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接