当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


Python numpy memmap用法及代码示例


本文简要介绍 python 语言中 numpy.memmap 的用法。

用法:

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

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

Memory-mapped 文件用于访问磁盘上大文件的小片段,而不将整个文件读入内存。 NumPy 的 memmap 是类似数组的对象。这与 Python 的 mmap 模块不同,后者使用 file-like 对象。

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

这个类在某些时候可能会变成一个工厂函数,它将视图返回到 mmap 缓冲区。

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

参数

filename str、file-like 对象或 pathlib.Path 实例

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

dtype 数据类型,可选

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

mode {‘r+’,‘r’,‘w+’,‘c’},可选

文件以这种模式打开:

‘r’

以只读方式打开现有文件。

‘r+’

打开现有文件进行读写。

‘w+’

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

‘c’

Copy-on-write:分配影响内存中的数据,但更改不会保存到磁盘。磁盘上的文件是只读的。

默认为“r+”。

offset 整数,可选

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

shape 元组,可选

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

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

指定 ndarray 内存布局的顺序:行优先、C 风格或列优先、Fortran-style。仅当形状大于一维时这才有效。默认顺序是“C”。

注意

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

Memory-mapped 文件在 32 位系统上不能大于 2GB。

当 memmap 导致创建或扩展文件超出文件系统中的当前大小时,未指定新部分的内容。在具有 POSIX 文件系统语义的系统上,扩展部分将用零字节填充。

例子

>>> data = np.arange(12, dtype='float32')
>>> data.resize((3,4))

此示例使用临时文件,因此 doctest 不会将文件写入您的目录。您将使用 ‘normal’ 文件名。

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

只读内存映射:

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

Copy-on-write 内存映射:

>>> fpc = np.memmap(filename, dtype='float32', mode='c', shape=(3,4))
>>> fpc.flags.writeable
True

可以分配给 copy-on-write 数组,但值仅写入数组的内存副本,而不写入磁盘:

>>> 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 str 或 pathlib.Path 实例

映射文件的路径。

offset int

文件中的偏移位置。

mode str

文件模式。

相关用法


注:本文由纯净天空筛选整理自numpy.org大神的英文原创作品 numpy.memmap。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。