调整 numpy.memmap
的代码似乎有效,但程序所做的更改不会保存。
def test_resize_inplace():
fA = np.memmap('A_r.npy', dtype='uint8', mode='w+', shape=(3,12))
print "fA"
print fA
fA[2][0] = 42
# resize by creating new memmap
new_fA = np.memmap('A_r.npy', mode='r+', dtype='uint8', shape=(20,12))
print 'fA'
print fA
print 'new_fA'
print new_fA
当我尝试调整大小的过程时,它会在线上压缩python解释器
print new_fA
以下代码:
def resize_memmap(fm,sz,tp):
fm.flush()
print fm.filename
new_fm = np.memmap(fm.filename, mode='r+', dtype= tp, shape=sz)
return new_fm
def test_resize_inplace():
fA = np.memmap('A_r.npy', dtype='uint8', mode='w+', shape=(3,12))
print "fA"
print fA
fA[2][0] = 42
sz= (20,12)
tp= 'uint8'
new_fA= resize_memmap(fA,sz,type)
new_fA[9][9]= 111
print 'fA'
print fA
print 'new_fA'
print new_fA
更新
我尝试了 .flush()
def test_memmap_flush():
fA = np.memmap('A_r.npy', dtype='uint8', mode='w+', shape=(3,12))
print "fA"
print fA
fA[2][0] = 42
fA.flush()
# fB = np.memmap('A_r.npy', dtype='uint8', mode='w+', shape=(3,12)) #fails
fB = np.memmap('A_r.npy', dtype='uint8', mode='r+', shape=(3,12))
print "fB"
print fB
print "done"
但我不明白为什么我不能 w+
模式?
IOError:[Errno 22]无效模式(' w + b')或文件名:' A_r.npy'
更新
好的,我明白了。w+
用于创建, r+
用于读取和写入。
答案 0 :(得分:0)
文件可能不会在访问之间刷新。尝试将memmap传递给你在一个带块中加载的文件对象:
with open('A_r.npy', 'w') as f:
fA = np.memmap(f, ...
with open('A_r.npy', 'r') as f:
fA = np.memmap(f, ...
答案 1 :(得分:0)
IO Error: [Errno 22]
?首先,我必须承认,大约六个月的时间,这给我带来了一些小麻烦,我已经为此进行了手动破解。
最后我找到了根本原因。
.memmap()
>巧合的是,-ed文件仍在另一个文件句柄下打开。
del aMMAP # first ( does .flush() before closing the underlying fileHandle
# # next, mmap again, with adjustments you need
aMMAP = np.memmap( ... )