操作后memmap文件位于何处?

时间:2014-05-07 13:04:23

标签: python numpy memory large-data

我有一个使用numpy memmap

的矩阵乘法代码
def test_memmap():
    fA = np.lib.format.open_memmap('A.npy', dtype='uint8', mode='r+')
    fB = np.lib.format.open_memmap('B.npy', dtype='uint8', mode='r+')

    #need to predefine size of result?
    #fC = np.memmap('C.npy', dtype='uint16', mode='w+', shape=(rows,rows))

    # print fA
    # print fB

    #where it stored if not gived filename?

    t0= time.time()
    fC= np.dot(fA,fB)
    print (time.time()-t0)

    print fC.filename
    print type(fC)

    # print fC[12:10]
    # print fC

memmap文件fC在运行后的位置?以及如何指定保存路径?

如何指出保存fC的位置(不将其存储在内存中)?可以自动检测数组的类型和大小吗?

1 个答案:

答案 0 :(得分:4)

虽然fC是numpy.core.memmap.memmap的一个实例, 它与任何文件都没有关联:

print(type(fC))
# <class 'numpy.core.memmap.memmap'>

print(fC._mmap)
# None

print(fC.filename)
# None

fC是memmap实例的原因是因为np.dot与大多数NumPy函数一样,试图返回与其参数相同类型的数组。所以memmap.__array_wrap__ method被调用了。最后调用的__array_finalize__ method会将_mmapfilenameoffsetmode属性设置为无。

如果您使用pdb之类的调试器单步执行代码,则可以看到__array_finalize__被调用。

尽管fC是一个memmap实例,但它只存在于内存中。


使用写入记忆图的结果计算np.dot

fC = np.memmap('/tmp/C.npy', dtype='float', mode='w+', shape=(Arows, Bcols))
np.dot(fA,fB, out=fC)
print fC.filename
# /tmp/C.npy
print type(fC)
# <class 'numpy.core.memmap.memmap'>