numpy.memmap

原文:https://docs.scipy.org/doc/numpy/reference/generated/numpy.memmap.html

译者:飞龙 UsyiyiCN

校对:(虚位以待)

class numpy.memmap[source]

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

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

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

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

删除要关闭的memmap实例。

参数:

filename:str或类文件对象

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

dtype:数据类型,可选

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

mode:{'r +','r','w +','c'},可选

该文件在此模式下打开:

'r' 打开现有文件以供阅读。
'r +' 打开现有文件进行读写。
'w +' 创建或覆盖现有文件进行读写。
'C' 写时复制:分配影响内存中的数据,但更改不会保存到磁盘。磁盘上的文件是只读的。

默认值为'r +'。

offset:int,可选

在文件中,数组数据从此偏移开始。由于offset以字节为单位,通常应为dtype的字节大小的倍数。模式 != 'r',甚至超过文件结尾的正偏移都有效;该文件将被扩展以容纳附加数据。默认情况下,memmap将从文件开头开始,即使filename是文件指针fpfp .tell() != 0

shape:tuple,可选

数组的所需形状。If mode == 'r' and the number of remaining bytes after offset is not a multiple of the byte-size of dtype, you must specify shape. 默认情况下,返回的数组将是1-D,其中元素的数量由文件大小和数据类型决定。

order:{'C','F'},可选

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

笔记

memmap对象可以在任何接受ndarray的地方使用。Given a memmap fp, isinstance(fp, numpy.ndarray) returns True.

内存映射数组使用Python内存映射对象(在Python 2.5之前)不允许文件大于某个大小,具体取决于平台。这个大小总是

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

使用与我们的数据匹配的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

删除在删除对象之前将内存更改刷新到磁盘:

>>> del fp

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

属性

文件名 (str)映射文件的路径。
抵消 (int)文件中的偏移位置。
模式 (str)文件模式。

方法

flush() 将数组中的任何更改写入磁盘上的文件。