高效清理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
相关产品推荐
相关产品推荐

