python - 缓慢的 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
解决方案
推荐阅读
- dataframe - 如何从相同df的两列的映射中更改Pyspark数据框中列的值
- c# - 如何在 .NET Core 运行时设置 Sentry 日志级别?
- r - 使用 R 拆分具有由标题分隔的多组数据的 CSV 并创建标识列
- r - 从单列数据中提取不同的向量(在 R 中)
- javascript - 即使在使用 display:hidden 隐藏对象后网页中的空白
- python - 删除字典列表周围的字符串引号
- python - sphinx_automodapi 扩展 - 为类继承图跳过一个类
- c# - 即使使用 NOCHECK CONSTRAINT,SQL Server 也会引发错误“DELETE 语句与 REFERENCE 约束冲突”
- python - 为什么 Visual Studio Code 中的 Python repl 告诉我我的对象未定义?
- java - 数组的排名值