使用AWK处理130亿行大CSV按复合键去重出现内存溢出如何解决
问题原因
你原来使用的awk -F, '!seen[$1,$2]++'命令需要在内存中维护一个哈希表存储所有已出现过的tag+time复合键,130亿行数据对应的哈希表内存占用会超过200GB,远高于你设备的128GB内存上限,因此触发OOM被系统终止。
可行解决方案
核心逻辑是先通过排序让相同tag+time的行连续排列,awk仅需要对比相邻行的复合键即可完成去重,全程内存占用不到100MB,完全不会出现内存不足问题。
具体执行步骤如下:
- 先导出表头到结果文件
head -n 1 data.csv > data_UNIQUE.csv
- 对数据行排序后去重,结果追加到目标文件
tail -n +2 data.csv | sort -t ',' -k1,1 -k2,2 --buffer-size=100G --parallel=20 | awk -F ',' '{cur = $1","$2} cur != prev {print; prev = cur}' >> data_UNIQUE.csv
参数说明
tail -n +2:跳过原文件的表头行,仅处理数据内容sort命令参数:-t ',':指定字段分隔符为逗号-k1,1 -k2,2:优先按第一列tag排序,再按第二列time排序,保证相同复合键的行连续出现--buffer-size=100G:分配100GB内存作为排序缓存,充分利用你的内存资源同时预留足够余量避免OOM--parallel=20:开启20线程并行排序,匹配你i9-10900K的20线程硬件规格,大幅提升排序速度
awk命令逻辑:仅存储上一行的复合键,当前行复合键与上一行不一致时就输出,内存占用极低
注意事项
- 请确保sort临时文件存储路径(默认是
/tmp)的剩余可用空间大于800GB,你的2TB NVME硬盘完全满足需求,排序完成后临时文件会自动清理 - 该方案适配你提供的CSV格式(字段内无逗号),可以得到符合预期的去重结果
内容的提问来源于stack exchange,提问作者Ajility
相关产品推荐
相关产品推荐

