使用wrdb.wrsamp()合并大量波形数据文件时出现内存异常
解决wrdb.wrsamp合并大量.dat文件内存溢出问题
你的核心问题是一次性加载所有文件数据到内存再写入,导致内存占用过高。针对这个场景,必须采用增量写入+逐文件处理的方案,避免内存堆积。
可行方案步骤
- 先提取单个文件的元信息(通道数、采样率、数据格式等),确保所有待合并文件的元信息一致(否则合并后数据无效)。
- 创建目标文件并写入元信息框架,之后循环处理每个.dat文件:
- 仅加载当前单个文件的3通道数据到内存
- 将当前数据追加写入目标文件
- 立即释放当前文件的内存资源,再处理下一个文件
示例代码(适配wrdb逻辑)
import wrdb import gc # 从第一个文件获取统一的元数据 first_file_path = "your_first_file.dat" src_db = wrdb.rdb(first_file_path) target_params = { "nchnls": src_db.nchnls, "samprate": src_db.samprate, "dtype": src_db.dtype } src_db.close() # 初始化目标文件 target_db = wrdb.wrdb("merged_output.dat", **target_params) total_samples_written = 0 # 遍历所有待合并文件(这里替换成你的文件列表生成逻辑) for file_idx in range(1, 10001): file_path = f"waveform_{file_idx}.dat" # 读取单个文件数据 tmp_db = wrdb.rdb(file_path) current_data = tmp_db.getdata() tmp_db.close() # 增量写入:如果wrdb.wrsamp支持append参数,直接用;否则指定起始采样点 # 方式1:支持append的情况 target_db.wrsamp(current_data, append=True) # 方式2:不支持append的情况,用累计采样点定位 # target_db.wrsamp(current_data, start=total_samples_written) # total_samples_written += current_data.shape[0] # 强制释放内存 del current_data, tmp_db gc.collect() target_db.close()
关键注意事项
- 必须确保所有输入文件的通道数、采样率、数据类型完全一致,否则合并后的文件会出现时序或格式错误。
- 如果wrdb官方文档中没有明确的
append参数,可查看wrsamp函数是否支持start参数(指定写入的起始采样位置),通过累计已写入的采样点数来实现增量追加。 - 加入
gc.collect()是为了主动触发Python垃圾回收,避免循环中内存逐步累积。 - 可添加异常捕获(如
try-except),防止单个文件读取失败导致整个合并流程中断,同时记录错误日志方便排查。
内容的提问来源于stack exchange,提问作者Lakmal
相关产品推荐
相关产品推荐

