当复制一个numpy memmap数组时会发生什么?

4
我正在从一个70GB的memmap数组中只读取~300MB的数据。在学习这个答案时,我了解到memmap实际上并不使用物理内存,因此我认为应该将所需的数组复制到物理内存中以提高性能。
然而,当我使用np.copy()复制一个memmap并使用np.info()查看复制后的数组时,类仍然是memmap。尽管如此,当使用复制后的数组时,我看到更多的内存使用和性能改进。
复制后的memmap是否使用物理内存?还是其他事情正在幕后发生?是不是看起来像我正在使用复制后的数组的物理内存,我的电脑总是欺骗我?

我认为mmap和你的memmap是不同的东西。 - YOU
1
是的,它们是不同的,但是numpy.memmap使用了mmap,所以这个问题仍然很相关。 - Robert Kern
1个回答

7

numpy.memmapnumpy.ndarray的子类。 memmap没有覆盖ndarray.copy()方法,因此ndarray.copy()的语义不会改变。确实会在新分配的内存中进行复制。由于多种原因,在使用子类时,ndarray.copy()尝试保持返回对象的类型相同。对于numpy.memmap来说,这样做意义不大,但对于其他子类(如numpy.matrix)来说则更有意义。

对于numpy.memmap,副本中的mmap特定属性设置为None,因此复制的数组将表现得就像一个numpy.ndarray一样,只是其类型仍然是numpy.memmap。检查源和副本中的._mmap属性以验证。


实际memmap的._mmap会给我 <mmap.mmap object at 0x7f32c64ce768>,但复制的数组的._mmap会给我 None。+1答案需附带证明! - Jee Seok Yoon
显然,np.copy不保留子类,而ndarray.copy则保留。由于OP指定了np.copy,这是否可以解释为什么内存消耗增加了? - Mike

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