numpy 数组的内存映射文件

Posted

技术标签:

【中文标题】numpy 数组的内存映射文件【英文标题】:Memory mapped file for numpy arrays 【发布时间】: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 的机器,所以这不是答案。 【参考方案1】:

您是否正在关注虚拟内存消耗,而不是物理内存消耗,而减速是来自其他原因?

【讨论】:

以上是关于numpy 数组的内存映射文件的主要内容,如果未能解决你的问题,请参考以下文章

从Google云存储中Numpy加载一个内存映射的数组(mmap_mode)

是否可以在内存映射文件中存储python对象(特别是sklearn模型)?

将 CSV 文件加载到 NumPy memmap 数组使用太多内存

从 python 传递到 C++ 的数组中未映射的内存访问

Numpy Ndarray 对象

python 内存映射的`npz`文件解决方法。 `numpy.load(npzfile,memmap_mode ='r')`忽略`memmap_mode`选项。这是一种解决方法