如何高效向.npy文件追加列且避免覆盖原文件?
优化.npy文件列追加速度的方案
核心问题分析
你当前的两种方法本质都是全量读取原文件→内存中合并数组→全量覆盖写入,50MB的文件单次读写已经有IO开销,25+文件累积下来IO瓶颈会非常明显——这是速度慢的核心原因。要提速必须从减少IO量、避免全量覆盖入手。
方案1:用Numpy内存映射(memmap)实现增量写入(无需全量覆盖)
memmap可以直接操作磁盘上的数组,不用把整个文件加载到内存,只需要修改需要追加的列区域:
import numpy as np file_path = f"{i}.npy" # 先读取原数组的基本信息(形状、数据类型),不用加载全量数据 with np.load(file_path, mmap_mode='r') as original_arr: rows, cols = original_arr.shape dtype = original_arr.dtype # 创建内存映射,扩展列数(原列数+2) new_cols = cols + 2 mmap_arr = np.memmap(file_path, dtype=dtype, mode='r+', shape=(rows, new_cols)) # 将新列写入扩展的区域 mmap_arr[:, cols] = macdLine mmap_arr[:, cols+1] = signalLine # 刷新到磁盘并释放映射 del mmap_arr
注意点:
- 确保
macdLine、signalLine的行数和原数组一致,数据类型匹配(如果不匹配可以先转换,比如macdLine.astype(dtype)) - 原文件必须是连续存储的numpy数组(大部分.npy文件都是),压缩格式无法用memmap
方案2:切换到HDF5格式(适合长期增量修改)
如果后续还要频繁追加列,直接换用HDF5格式(用h5py库)更合适,它原生支持动态扩展数据集,不需要全量覆盖:
import h5py import numpy as np file_path = f"{i}.h5" # 换成h5格式 # 第一次转换原npy文件到h5(仅需一次) # with h5py.File(file_path, 'w') as f: # original_arr = np.load(f"{i}.npy") # f.create_dataset('data', data=original_arr, chunks=True, maxshape=(None, None)) # 追加列操作 with h5py.File(file_path, 'r+') as f: dataset = f['data'] current_cols = dataset.shape[1] # 扩展数据集的列数 dataset.resize(current_cols + 2, axis=1) # 写入新列 dataset[:, current_cols] = macdLine dataset[:, current_cols+1] = signalLine
优势:
- 后续再追加其他列时,直接重复上述追加步骤即可,无需全量读写
- 支持分块存储,大文件IO效率比.npy更高
现有方法的紧急优化(不换格式的情况下)
如果暂时不想改文件格式,优化现有代码的细节也能提速:
优化方法1:
关闭不必要的allow_pickle,固定数据类型,避免自动转换:
import numpy as np file_path = f"{i}.npy" original_arr = np.load(file_path) # 提前确保新数组和原数组 dtype 一致 macdLine = macdLine.astype(original_arr.dtype) signalLine = signalLine.astype(original_arr.dtype) # 关闭allow_pickle(不需要存储对象时,关闭能减少序列化开销) np.save(file_path, np.column_stack((original_arr, macdLine, signalLine)), allow_pickle=False)
优化方法2:
跳过DataFrame转换,直接用numpy操作,减少中间开销:
# 直接用numpy合并,省去DataFrame转换的冗余步骤 original_arr = np.load(file_path) new_arr = np.column_stack((original_arr, macdLine, signalLine)) np.save(file_path, new_arr, allow_pickle=False)
内容的提问来源于stack exchange,提问作者rn kim
相关产品推荐
相关产品推荐

