numpy.memmap

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

创建存储在 二元的 磁盘上的文件。

内存映射文件用于访问磁盘上大文件的小部分,而不需要将整个文件读取到内存中。numpy的memmap是类似数组的对象。这和python的不同 mmap 模块,使用类似文件的对象。

Ndarray的这个子类与一些操作有一些不愉快的交互,因为它不太适合作为子类。使用此子类的另一种选择是创建 mmap 对象自己,然后用 ndarray.__new__ 直接传递在其'buffer='参数中创建的对象。

这个类可能在某个时刻被转换成一个工厂函数,它将视图返回到mmap缓冲区。

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

参数
filenamestr、类似文件的对象或pathlib.path实例

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

dtype数据类型,可选

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

mode'R+'、'R'、'W+'、'C',可选

文件在此模式下打开:

“R”

打开现有文件以只读。

“R+”

打开现有文件进行读写。

“W+”

创建或覆盖现有文件进行读写。

“C”

写时复制:分配会影响内存中的数据,但更改不会保存到磁盘。磁盘上的文件是只读的。

默认值为“r+”。

offset可选的

在文件中,数组数据从这个偏移开始。自从 offset 以字节为单位,通常应为 dtype . 什么时候? mode != 'r' ,即使超出文件结尾的正偏移也是有效的;该文件将被扩展以容纳附加数据。默认情况下, memmap 将从文件的开头开始,即使 filename 是文件指针 fpfp.tell() != 0 .

shape可选元组

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

order'C'、'F',可选

指定ndarray内存布局的顺序: row-major C风格或 column-major ,Fortran样式。这仅在形状大于1-d时有效。默认顺序为“c”。

参见

lib.format.open_memmap

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

笔记

memmap对象可以在任何接受ndarray的地方使用。给定一个内存映射 fpisinstance(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')

使用与数据匹配的数据类型和形状创建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)

只读内存映射:

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

可以在写阵列上分配到copy,但值只写入阵列的内存副本,而不写入磁盘:

>>> 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实例

映射文件的路径。

offset利息

文件中的偏移位置。

modeSTR

文件模式。

方法

flush ()

将阵列中的任何更改写入磁盘上的文件。