← 中文资源

简体中文版本

用哈希索引去重大型 CSV

用内存中的键哈希集合单遍流式去除超大 CSV 中的重复行。

阅读英文原文

目标

合并导出包含数百万重复行,又无法一次性全部载入内存。本配方流式读取文件,对自然键做哈希并存入集合,只写出每个键的首次出现,从而以「唯一键数量」而非「总行数」的内存完成去重;提醒哈希需足够强、内存超出时按哈希前缀分片。

步骤要点

  1. 流式读取并对自然键做哈希存入集合。
  2. 只写出每个键的首次出现。
  3. 用强哈希并以不易冲突的分隔符拼接键字段。
  4. 比较输入输出行数报告去重数量。
import csv, hashlib, sys
seen = set()
with open('in.csv', newline='') as fin, open('out.csv', 'w', newline='') as fout:
    reader = csv.reader(fin)
    writer = csv.writer(fout)
    header = next(reader); writer.writerow(header)
    for row in reader:
        key = hashlib.sha1('\x1f'.join(row[:4]).encode()).digest()
        if key in seen: continue
        seen.add(key); writer.writerow(row)

排错提示

  • 哈希碰撞需用强哈希与唯一分隔符。
  • 唯一键超出内存时需分片或落盘。
  • 键字段大小写不一致会影响去重。

适用边界

  • 内存与唯一键数量成正比。
  • 单遍处理不做跨文件对账。