我有一个使用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的位置(不将其存储在内存中)?可以自动检测数组的类型和大小吗?
答案 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会将_mmap
,filename
,offset
和mode
属性设置为无。
如果您使用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'>