numpy.memmap#

class numpy.memmap(filename, dtype=<class 'numpy.ubyte'>, mode='r+', offset=0, shape=None, order='C')[源代码]#

创建到存储在磁盘上的二进制文件中的数组的内存映射.

Memory-mapped files(内存映射文件)用于访问磁盘上大型文件的小段内容,而无需将整个文件读入内存.NumPy 的 memmap 是类数组对象.这与 Python 的 mmap 模块不同,后者使用类文件对象.

这个 ndarray 的子类与某些操作有一些令人不快的交互,因为它作为子类不太合适.使用此子类的替代方法是自己创建 mmap 对象,然后使用 ndarray.__new__ 直接创建一个 ndarray,并在其“buffer=”参数中传递创建的对象.

此类可能在某个时候会变成一个工厂函数,该函数返回 mmap 缓冲区的视图.

刷新 memmap 实例以将更改写入文件. 目前,没有 API 可以关闭底层的 mmap . 很难确保资源确实已关闭,因为它可能在不同的 memmap 实例之间共享.

参数:
filenamestr, 类文件对象, 或 pathlib.Path 实例

要用作数组数据缓冲区的文件名或文件对象.

dtypedata-type,可选

用于解释文件内容的数据类型. 默认为 uint8 .

模式{‘r+’, ‘r’, ‘w+’, ‘c’}, 可选

文件在此模式下打开:

‘r’

打开现有文件以进行只读.

‘r+’

打开现有文件以进行读取和写入.

‘w+’

创建或覆盖现有文件以进行读取和写入. 如果 mode == 'w+' ,则还必须指定 shape .

‘c’

Copy-on-write(写入时复制):赋值会影响内存中的数据,但更改不会保存到磁盘. 磁盘上的文件是只读的.

默认为 ‘r+’.

offset整数,可选

在文件中,数组数据从此 offset 开始. 由于 offset 以字节为单位测量,因此它通常应该是 dtype 的字节大小的倍数. 当 mode != 'r' 时,即使超过文件末尾的正偏移量也是有效的; 文件将被扩展以容纳额外的数据. 默认情况下,即使 filename 是文件指针 fp 并且 fp.tell() != 0 , memmap 也将从文件开头开始.

shapeint 或 int 序列, 可选

数组的所需形状.如果 mode == 'r' 并且 after offset 之后剩余的字节数不是 dtype 的字节大小的倍数,则必须指定 shape . 默认情况下,返回的数组将是 1-D,其元素数量由文件大小和数据类型决定.

在 2.0 版本发生变更: 现在,形状参数可以是任何整数序列类型,以前类型仅限于元组和int.

order{‘C’, ‘F’},可选

指定ndarray内存布局的顺序 row-major ,C风格或 column-major ,Fortran风格.这仅在形状大于1维时有效.默认顺序是’C’.

参见

lib.format.open_memmap

创建或加载内存映射的 .npy 文件.

注释

memmap对象可以在接受ndarray的任何地方使用.给定一个memmap fp , isinstance(fp, numpy.ndarray) 返回 True .

在32位系统上,内存映射文件不能大于2GB.

当memmap导致文件被创建或扩展到文件系统中当前大小之外时,新部分的内容是不确定的.在使用POSIX文件系统语义的系统上,扩展的部分将填充零字节.

示例

>>> import numpy as np
>>> 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和形状的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()

加载memmap并验证数据是否已存储:

>>> 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)

只读memmap:

>>> fpr = np.memmap(filename, dtype='float32', mode='r', shape=(3,4))
>>> fpr.flags.writeable
False

写时复制memmap:

>>> 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)
属性:
filenamestr 或 pathlib.Path 实例

映射文件的路径.

offsetint

文件中的偏移位置.

模式str

文件模式.

方法

flush ()

将数组中的任何更改写入磁盘上的文件.