编辑使用memmap

时间:2018-02-09 21:32:22

标签: python numpy-memmap

我是使用numpy.core.memmap对象的新手,并且无法弄清楚如何使用numpy.memmap()编辑读入python的现有.npy文件。例如,按照Scipy.org的示例,我可以创建一个对象并写入它,但是一旦创建,我就无法修改内容。

from tempfile import mkdtemp
import os.path as path

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

filename = path.join(mkdtemp(), 'newfile.dat')
fp = np.memmap(filename, dtype='float32', mode='w+', shape=(3,4))
fp[:] = data[:] ### write data to fp array

del fp ### remove fp object

fpc = np.memmap(filename, dtype='float32', mode='c', shape=(3,4)) ### This is writeable in memory

fpc[0,:] = 0

del fpc ### close object

这只是从内存中删除对象,但不修改filename中的对象。我也尝试了numpy.memmap.flush(fpc),但这似乎也不起作用。

通过阅读其他帖子我可以简单地将编辑过的.npy文件复制到另一个位置,但这似乎在磁盘空间方面可能会出现问题。你不能修改现有的.npy文件是否正确?

1 个答案:

答案 0 :(得分:1)

Numpy解释"复制写作" as "将更改写入ram,但不要将它们保存到磁盘" HTTP Strict Transport Security response header)。当引用可以在线程或进程之间共享的数据时,这是一个相当标准的实现。听起来你把写副本与docs混淆了(有时会使用类似的术语,但是引用磁盘写入而不是ram)。

如果您将mode="c"更改为mode="r+"(或将mode关键字删除为"无论如何,r +"是默认值),这可以解决您的问题。

此外,我想指出,在大多数情况下,使用snapshotsnp.save更简单,更pythonic,只需在加载时使用正确的模式指定mmap_mode关键字文件。虽然在技术上限制了灵活性,但这样就无需指定一些关键字使事情变得更简洁。