【问题标题】:Where memmap file is located after operation?运行后memmap文件在哪里?
【发布时间】:2014-06-24 11:33:09
【问题描述】:

我有一个使用 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 的位置(而不是将其存储在内存中)?可以自动检测数组的类型和大小吗?

【问题讨论】:

    标签: python numpy memory large-data


    【解决方案1】:

    虽然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 属性设置为None。

    如果您使用 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'>
    

    【讨论】:

    • 我怎样才能指出保存 fC 的位置(而不是将其存储在内存中)?可以自动检测数组的类型和大小吗?
    • 您可以将fC 保存到npy 文件:np.save(path, fC),然后将其读回memmap:fC = np.lib.format.open_memmap(...)。形状以 npy 格式存储。
    • 但问题是我需要将数据完全写入磁盘,我无法将临时结果保存在内存中。
    • np.dot,像许多 NumPy 函数一样,有一个 out 参数。如果您指定out 参数,则结果将写入该参数给定的数组。我编辑了上面的帖子,展示了如何将 fC 初始化为 memmap,然后使用 out 参数让 np.dot 直接写入它。
    猜你喜欢
    • 1970-01-01
    • 2013-10-13
    • 1970-01-01
    • 2011-09-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多