numpy.
memmap
[源代码] ¶创建到存储在磁盘上的二进制文件中的数组的内存映射。
内存映射文件用于访问磁盘上大文件的小片段,而无需将整个文件读入内存。NumPy的memmap是类似数组的对象。这不同于Python的mmap
模块,后者使用类似文件的对象。
ndarray的该子类与某些操作有一些不愉快的交互,因为它不太适合作为子类。使用此子类的另一种方法是自己创建mmap
对象,然后直接使用ndarray .__ new__创建ndarray,并在其'buffer ='参数中传递创建的对象。
此类可能在某些时候变成了工厂函数,该函数将视图返回到mmap缓冲区。
删除memmap实例以关闭memmap文件。
用作数组数据缓冲区的文件名或文件对象。
用于解释文件内容的数据类型。默认值为uint8
。
在这种模式下打开文件:
'r' |
打开现有文件仅供读取。 |
'r +' |
打开现有文件进行读写。 |
'w +' |
创建或覆盖现有文件以进行读写。 |
'C' |
写入时复制:分配会影响内存中的数据,但更改不会保存到磁盘。磁盘上的文件是只读的。 |
默认值为“ r +”。
在文件中,数组数据从此偏移量开始。由于偏移量是以字节为单位的,因此通常应为的字节大小的倍数dtype
。当时,甚至超出文件末尾的正偏移量都有效;该文件将被扩展以容纳其他数据。默认情况下,即使文件指针为和
,也将从文件的开头开始。mode != 'r'
memmap
filename
fp
fp.tell() != 0
所需的阵列形状。如果和剩余字节后面的数字偏移不是字节大小的倍数,则必须指定。默认情况下,返回的数组将为一维,其元素数由文件大小和数据类型确定。mode == 'r'
dtype
shape
指定ndarray内存布局的顺序: row-major,C样式或column-major,Fortran样式。仅当形状大于一维时才有效。默认顺序为“ C”。
也可以看看
lib.format.open_memmap
创建或加载内存映射.npy
文件。
笔记
memmap对象可以在任何接受ndarray的地方使用。给定一个内存映射fp
,返回
。isinstance(fp, numpy.ndarray)
True
在32位系统上,内存映射文件不能大于2GB。
当memmap导致文件在文件系统中的创建或扩展超出其当前大小时,未指定新部分的内容。在具有POSIX文件系统语义的系统上,扩展部分将填充零字节。
例子
>>> data = np.arange(12, dtype='float32')
>>> data.resize((3,4))
本示例使用一个临时文件,以便doctest不会将文件写入目录。您将使用“普通”文件名。
>>> from tempfile import mkdtemp
>>> import os.path as path
>>> filename = path.join(mkdtemp(), 'newfile.dat')
使用与我们的数据相匹配的dtype和shape创建一个内存映射:
>>> fp = np.memmap(filename, dtype='float32', mode='w+', shape=(3,4))
>>> fp
memmap([[0., 0., 0., 0.],
[0., 0., 0., 0.],
[0., 0., 0., 0.]], dtype=float32)
将数据写入memmap数组:
>>> fp[:] = data[:]
>>> fp
memmap([[ 0., 1., 2., 3.],
[ 4., 5., 6., 7.],
[ 8., 9., 10., 11.]], dtype=float32)
>>> fp.filename == path.abspath(filename)
True
删除操作会在删除对象之前将内存更改刷新到磁盘:
>>> del fp
加载内存映射并验证数据是否已存储:
>>> newfp = np.memmap(filename, dtype='float32', mode='r', shape=(3,4))
>>> newfp
memmap([[ 0., 1., 2., 3.],
[ 4., 5., 6., 7.],
[ 8., 9., 10., 11.]], dtype=float32)
只读内存映射:
>>> fpr = np.memmap(filename, dtype='float32', mode='r', shape=(3,4))
>>> fpr.flags.writeable
False
写时复制内存映射:
>>> fpc = np.memmap(filename, dtype='float32', mode='c', shape=(3,4))
>>> fpc.flags.writeable
True
可以分配给写时复制数组,但是值仅写入数组的内存副本,而不写入磁盘:
>>> fpc
memmap([[ 0., 1., 2., 3.],
[ 4., 5., 6., 7.],
[ 8., 9., 10., 11.]], dtype=float32)
>>> fpc[0,:] = 0
>>> fpc
memmap([[ 0., 0., 0., 0.],
[ 4., 5., 6., 7.],
[ 8., 9., 10., 11.]], dtype=float32)
磁盘上的文件未更改:
>>> fpr
memmap([[ 0., 1., 2., 3.],
[ 4., 5., 6., 7.],
[ 8., 9., 10., 11.]], dtype=float32)
偏移到memmap中:
>>> fpo = np.memmap(filename, dtype='float32', mode='r', offset=16)
>>> fpo
memmap([ 4., 5., 6., 7., 8., 9., 10., 11.], dtype=float32)
映射文件的路径。
文件中的偏移位置。
文件模式。
方法
|
将阵列中的所有更改写入磁盘上的文件。 |