numpy.memmap¶
- 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
是文件指针fp
和fp .tell() != 0
。shape:tuple,可选
order:{'C','F'},可选
指定ndarray内存布局的顺序:row-major,C风格或column-major,Fortran风格。这只有在形状大于1-D时才有效果。默认顺序为“C”。
笔记
memmap对象可以在任何接受ndarray的地方使用。Given a memmap
fp
,isinstance(fp, numpy.ndarray)
returnsTrue
.内存映射数组使用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
()将数组中的任何更改写入磁盘上的文件。