调整numpy.memmap的位置

时间:2014-05-19 14:32:57

标签: python numpy memory numpy-memmap

调整 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+ 用于读取和写入。

2 个答案:

答案 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( ... )

希望这有助于 Credit goes to Michael Droettboom