【发布时间】:2014-11-29 23:51:13
【问题描述】:
我需要读取存储在内存映射文件中的巨大 numpy 数组的一部分,处理数据并重复数组的另一部分。整个 numpy 数组占用大约 50 GB,而我的机器有 8 GB 的 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
但是,当我尝试访问 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 的机器,所以这不是答案。
标签: numpy memory large-files large-data