numpy.memmap #
- 类 numpy. memmap ( filename , dtype=<class 'numpy.ubyte'> , mode='r+' , offset=0 , shape=None , order='C' ) [来源] #
创建到存储在磁盘上的二进制文件中的数组的内存映射。
内存映射文件用于访问磁盘上大文件的小片段,而不会将整个文件读入内存。 NumPy 的 memmap 是类似数组的对象。这与 Python 的
mmap
模块不同,后者使用类似文件的对象。ndarray 的这个子类与某些操作有一些令人不愉快的交互,因为它不太适合作为子类。使用此子类的另一种方法是自己创建对象
mmap
,然后直接使用 ndarray.__new__ 创建一个 ndarray,并传递在其 'buffer=' 参数中创建的对象。这个类可能在某个时候变成一个工厂函数,它将视图返回到 mmap 缓冲区中。
刷新 memmap 实例以将更改写入文件。目前没有API可以关闭底层
mmap
。确保资源实际关闭是很棘手的,因为它可能在不同的 memmap 实例之间共享。- 参数:
- filename str、类文件对象或 pathlib.Path 实例
用作数组数据缓冲区的文件名或文件对象。
- dtype数据类型,可选
用于解释文件内容的数据类型。默认为
uint8
.- 模式{'r+', 'r', 'w+', 'c'}, 可选
文件以此模式打开:
'r'
打开现有文件以只读方式。
'r+'
打开现有文件进行读取和写入。
'w+'
创建或覆盖现有文件以进行读写。如果则还必须指定。
mode == 'w+'
shape
'C'
写入时复制:分配会影响内存中的数据,但更改不会保存到磁盘。磁盘上的文件是只读的。
默认为“r+”。
- 偏移量int,可选
在文件中,数组数据从此偏移量开始。由于偏移量以字节为单位测量,因此它通常应该是 的字节大小的倍数
dtype
。当 时,即使超出文件末尾的正偏移量也是有效的;该文件将扩展以容纳附加数据。默认情况下,将从文件开头开始,即使是文件指针和 .mode != 'r'
memmap
filename
fp
fp.tell() != 0
- 形状元组,可选
所需的阵列形状。如果偏移后的剩余字节数不是 的字节大小的倍数,则必须指定。默认情况下,返回的数组将为一维数组,元素数量由文件大小和数据类型确定。
mode == 'r'
dtype
shape
- 订单{'C', 'F'},可选
指定 ndarray 内存布局的顺序: 行优先,C 风格或列优先,Fortran 风格。仅当形状大于一维时这才有效。默认顺序是“C”。
也可以看看
lib.format.open_memmap
创建或加载内存映射
.npy
文件。
笔记
memmap 对象可以在任何接受 ndarray 的地方使用。给定一个 memmap
fp
,返回 。isinstance(fp, numpy.ndarray)
True
在 32 位系统上,内存映射文件不能大于 2GB。
当内存映射导致文件被创建或扩展超出文件系统中的当前大小时,新部分的内容是未指定的。在具有 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 的 memmap:
>>> 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
将内存更改刷新到磁盘以便将其读回
>>> fp.flush()
加载内存映射并验证数据是否已存储:
>>> 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)
偏移到内存映射中:
>>> fpo = np.memmap(filename, dtype='float32', mode='r', offset=16) >>> fpo memmap([ 4., 5., 6., 7., 8., 9., 10., 11.], dtype=float32)
- 属性:
- filename str 或 pathlib.Path 实例
映射文件的路径。
- 偏移量整数
文件中的偏移位置。
- 模式str
文件模式。
方法
flush
()将数组中的任何更改写入磁盘上的文件。