You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

高效清理100GB级CSV文件hash列重复值的最优方案求助

高效去重解决方案(适配大体积CSV)

方案1:优化Polars LazyFrame参数,降低内存占用

你之前的Polars代码可以通过调整参数进一步压缩内存开销,避免溢出:

import polars as pl

# 明确指定列类型,避免schema推断的额外内存消耗
schema = {
    "sex": pl.String,
    "name": pl.String,
    "dob": pl.String,
    "hash": pl.String
}

df = pl.scan_csv(
    "input.csv",
    separator=";",
    schema=schema,
    ignore_errors=True,
    rechunk=True,  # 合并小分块,减少内存碎片化
    low_memory=True,  # 启用低内存模式,逐块处理数据
    batch_size=10_000_000  # 根据自身内存情况调整批次大小
)

# 先筛选需要的列再去重,减少内存中存储的冗余数据
uni_df = df.select("sex", "name", "dob", "hash").unique(subset=["hash"], keep="first").drop("hash")

# 配置大缓冲提升写入速度
uni_df.sink_csv(
    "output.csv",
    separator=";",
    maintain_order=False,
    buffer_size=1024*1024*64  # 64MB写入缓冲
)

方案2:使用awk命令行工具(最快、最低内存)

对于超大型文本文件,命令行工具awk是最优选择——它逐行处理文件,仅在内存中存储已出现的hash,内存占用极低,速度远超Python框架:

awk -F';' '!seen[$4]++ {print $1";"$2";"$3}' input.csv > output.csv
  • -F';':指定分隔符为分号
  • !seen[$4]++:用数组seen记录第4列(hash)的出现状态,未出现过则执行打印
  • print $1";"$2";"$3:输出去重后的目标列(剔除hash列)

方案3:Apache Spark(适配未来TB级文件)

如果未来文件体积增长到TB级别,可使用Spark进行分布式处理,内存占用可控:

from pyspark.sql import SparkSession

spark = SparkSession.builder \
    .appName("CSV Deduplication") \
    .config("spark.driver.memory", "16g")  # 根据自身硬件调整,比如32g
    .getOrCreate()

# 读取CSV并指定schema
df = spark.read.csv(
    "input.csv",
    sep=";",
    header=True,
    schema="sex string, name string, dob string, hash string"
)

# 去重后写入结果
df.dropDuplicates(["hash"]).drop("hash").write.csv(
    "output.csv",
    sep=";",
    header=True,
    mode="overwrite"
)

spark.stop()

Spark会自动分块处理文件,即使是TB级数据也能平稳运行,适合长期大规模数据处理需求。


内容的提问来源于stack exchange,提问作者Repzz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 00:47:29