基于Go协程的大文件高效处理:删除全值为N的列并更新格式
超大文件处理需求及Go语言实现方案
一、文件背景
待处理文件大小约5-10GB,包含两类核心行:
- 以
#define CHAR_DEF开头的行 - 以
%开头的行
二、行规则与处理逻辑
1. % 行有效性判断
% 行格式要求:% <数字> <元素1> <元素2> ...,有效行需满足数字值与后续元素数量完全匹配:
- 有效行示例:
% 5 A B C Df E city# plant# - 无效行示例:
% 5 A Bb Cc DD f Ee city# plant#
2. 整体处理规则
- 仅处理
#define CHAR_DEF行和有效%行 - 直接忽略无效
%行 - 一旦遇到其他以
#define开头的行,立即终止所有处理
三、核心处理任务
- 识别所有**在有效
%行中值全为"N"**的列,将这些列从#define CHAR_DEF行和所有有效%行中删除 - 更新每个有效
%行开头的数字,使其与删除列后的剩余元素数量匹配
四、处理示例
输入文件(InputFile.txt)
#define CHAR_DEF header1 header2 h3 h4 h5 h6 % 6 N 1.2 r e N N city# plant# % 6 N 2 3.2 r N x city# plant2 % 7 y w 2.3 3 d w c city# plant3 <invalid line> #define CHAR_POINT h1 h2 h3 h4 <processing should stop here> % 4 X h 1 1.2
输出文件(OutputFile.txt)
#define CHAR_DEF header2 h3 h4 h6 % 4 1.2 r e N city# plant# % 4 2 3.2 r x city# plant2
示例说明
header1和h5列因所有有效%行对应位置的值均为"N",被删除- 以
% 7开头的行因元素数量与开头数字不匹配,被忽略 - 处理在
#define CHAR_POINT行出现时立即停止
五、Go语言高效实现思路(基于协程)
为兼顾10GB级大文件的时间与内存效率,采用分阶段+协程流水线的方案:
1. 第一阶段:扫描有效行,标记全"N"列
- 启动读取协程逐行读取文件,过滤出
#define CHAR_DEF行和有效%行,遇到其他#define行则停止读取 - 解析
#define CHAR_DEF行得到列总数,初始化布尔数组标记每列是否全为"N" - 遍历每个有效
%行的元素列,若某列出现非"N"值,将对应标记置为false - 此阶段仅存储列标记数组,不保存完整行数据,严格控制内存占用
2. 第二阶段:二次扫描,生成输出文件
- 再次启动读取协程逐行读取文件(或复用第一阶段记录的行位置索引)
- 对
#define CHAR_DEF行,根据标记数组过滤全"N"列,生成新表头行写入输出 - 对每个有效
%行,过滤全"N"列,统计剩余元素数量后更新开头数字,再写入输出 - 遇到其他
#define行立即停止写入 - 用协程实现读取、处理、写入的流水线作业,提升整体处理速度
3. 内存优化要点
- 全程采用逐行流式处理,避免一次性加载整个文件到内存
- 第一阶段仅维护列标记数组,内存占用仅与列数相关,与文件大小无关
- 第二阶段处理行时直接生成目标字符串并写入,不缓存大量行数据
内容的提问来源于stack exchange,提问作者Ravi Patel
相关产品推荐
相关产品推荐

