首页 > 解决方案 > 缓慢的 numpy memmap 和 fromfile

问题描述

我有多个二进制(结构化)文件,每个 2GB,我目前正在使用 memmap 读取并处理相同的文件。我想尽量减少这个 IO 进程所需的时间。

我将其实现为 Cython 函数,尽管当处理两次相同的文件时,将 memmap 数组复制到 numpy 数组非常快(约 3 秒),但如果要读取新文件(约 71 秒)则需要大量时间),可能是因为缓存内存,这与 numpy fromfile 也是一样的。

还有其他有效读取大型二进制文件的方法吗?

编辑(添加了更多信息):

首次运行(通过 echo 3 > /proc/sys/vm/drop_caches 清除缓存后):

将 memap 数组复制为 numpy 数组所需的时间..71.1619570255 秒

第二次运行(在同一组 2GB 文件上,不清除缓存):

将 memap 数组复制为 numpy 数组所需的时间..2.86509585381 秒

使用的代码:

cpdef tuple decrypt_file(file_name, file_name1):

    cdef long long int templen = 0
    cdef long long int templen1= 0
    cdef np.ndarray tempcomf   =   np.zeros((templen, 1024),dtype=np.int8)
    cdef np.ndarray tempcomf1  =   np.zeros((templen1, 1024),dtype=np.int8)



    dt       = np.dtype([('header', 'S8'), ('Source', 'S10'), ('header_rest', 'S10'), ('Packet', '>u4'), ('data', '>i1', 1024)])
    comf     = np.memmap(file_name,  dtype = dt, mode = 'c')
    comf1    = np.memmap(file_name1, dtype = dt, mode = 'c')

    templen =   comf['Packet'][-1]-comf['Packet'][0]
    templen1=   comf1['Packet'][-1]-comf1['Packet'][0]

    t_1      =   time.time()
    tempcomf =   comf['data']
    tempcomf1=   comf1['data']
    print('Time take for memarray copy...'+str(time.time()-t_1))
    tempcomf = tempcomf.ravel()
    tempcomf1= tempcomf1.ravel()


    tempcomf_X =   np.array(tempcomf[1::2], order = 'F')
    tempcomf_Y =   np.array(tempcomf[0::2], order = 'F')
    tempcomf1_X=   np.array(tempcomf1[1::2],order = 'F')
    tempcomf1_Y=   np.array(tempcomf1[0::2],order = 'F')

    return tempcomf_X, tempcomf_Y, tempcomf1_X, tempcomf1_Y

标签: pythonpython-3.xnumpysignal-processingcython

解决方案


推荐阅读