numpy.memmap#
- 类 numpy.memmap(filename, dtype=<class 'numpy.ubyte'>, mode='r+', offset=0, shape=None, order='C')[source]#
- 创建一个内存映射,映射到磁盘上的 二进制 文件中存储的数组。 - 内存映射文件用于访问磁盘上大型文件的 L 小段,而无需将整个文件读入内存。NumPy 的 memmap 是类数组对象。这与 Python 的 - mmap模块不同,后者使用类文件对象。- ndarray 的这个子类在某些操作中会产生一些不愉快的交互,因为它作为子类并不完全合适。使用此子类的一个替代方法是自己创建 - mmap对象,然后直接使用 ndarray.__new__ 创建一个 ndarray,将创建的对象作为其“buffer=”参数传入。- 这个类在某个时候可能会变成一个工厂函数,返回一个 mmap 缓冲区的视图。 - 刷新 memmap 实例以将更改写入文件。目前没有 API 可以关闭底层的 - mmap。由于它可能在不同的 memmap 实例之间共享,因此很难确保资源真正关闭。- 参数:
- filename字符串、类文件对象或 pathlib.Path 实例
- 用作数组数据缓冲的文件名或文件对象。 
- dtype数据类型,可选
- 用于解释文件内容的数据类型。默认值为 - uint8。
- mode{‘r+’, ‘r’, ‘w+’, ‘c’},可选
- 文件以此模式打开 - ‘r’ - 只读打开现有文件。 - ‘r+’ - 读写打开现有文件。 - ‘w+’ - 创建或覆盖现有文件以进行读写。如果 - mode == 'w+',则还必须指定- shape。- ‘c’ - 写时复制:赋值会影响内存中的数据,但更改不会保存到磁盘。磁盘上的文件是只读的。 - 默认值为 ‘r+’。 
- offset整数,可选
- 文件中,数组数据从该偏移量开始。由于 offset 以字节为单位测量,因此通常应是 - dtype字节大小的倍数。当- mode != 'r'时,即使超出文件末尾的正偏移量也有效;文件将被扩展以容纳额外的数据。默认情况下,- memmap将从文件开头开始,即使- filename是文件指针- fp并且- fp.tell() != 0。
- shape整数或整数序列,可选
- 数组的期望形状。如果 - mode == 'r'且 offset 后剩余的字节数不是- dtype字节大小的倍数,则必须指定- shape。默认情况下,返回的数组将是 1-D 的,元素数量由文件大小和数据类型确定。- 2.0 版本中的变化: shape 参数现在可以是任何整数序列类型,以前类型仅限于元组和整数。 
- order{‘C’, ‘F’},可选
- 指定 ndarray 内存布局的顺序:行主序,C 风格;或 列主序,Fortran 风格。这仅在形状大于 1-D 时才有效。默认顺序是 '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 和 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() - 加载 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) - 属性:
- filename字符串或 pathlib.Path 实例
- 映射文件的路径。 
- offset整数
- 文件中的偏移位置。 
- mode字符串
- 文件模式。 
 
 - 方法 - flush()- 将数组中的任何更改写入磁盘文件。