如何高效读取6GB+大型数据集并按指定ID列拆分文件?
优化大TSV文件按ID拆分的方法
原方案的核心问题是一次性加载全量数据占用大量内存,且遍历每个ID时重复筛选全量数据,导致效率极低。以下是几种更快的实现方式:
方法1:Pandas分块读取+按ID追加写入
通过分块读取数据,每次只处理一小部分,将对应ID的数据追加到目标文件,避免内存过载和重复扫描:
import pandas as pd import os path = "your_data_path.tsv" output_dir = "output_dir/" os.makedirs(output_dir, exist_ok=True) # 定义分块大小(根据内存调整,比如100万行) chunk_size = 1_000_000 colnames = ["aaa", "bbb", "ccc", "...", "ID", "zzz"] for chunk in pd.read_csv(path, engine='python', header=None, names=colnames, sep=r'\t', chunksize=chunk_size): # 按ID分组处理当前块 for id_val, group in chunk.groupby('ID'): output_path = os.path.join(output_dir, f"ID{id_val}.csv") # 首次写入加表头,后续追加不加 header = not os.path.exists(output_path) group.to_csv(output_path, mode='a', index=False, na_rep='N/A', header=header)
方法2:使用Dask处理大数据
Dask能并行处理超出内存的数据集,语法和Pandas兼容,适合大规模数据拆分:
import dask.dataframe as dd import os path = "your_data_path.tsv" output_dir = "output_dir/" os.makedirs(output_dir, exist_ok=True) colnames = ["aaa", "bbb", "ccc", "...", "ID", "zzz"] # 用Dask读取数据 ddf = dd.read_csv(path, sep=r'\t', header=None, names=colnames, engine='python') # 按ID分组并导出,Dask会自动并行处理 ddf.groupby('ID').apply(lambda df: df.to_csv(os.path.join(output_dir, f"ID{df.name}.csv"), index=False, na_rep='N/A'), meta=object).compute()
方法3:用Awk命令行工具(最快的纯文本处理方式)
如果不需要复杂的Python逻辑,Awk处理纯文本TSV的速度远快于Python,直接在终端执行:
awk -F '\t' '{print > "output_dir/ID"$(NF-1)".csv"}' your_data_path.tsv
$(NF-1)表示倒数第二列(NF是当前行的列数)- 如果需要表头,可以先提取表头,再追加到每个文件:
# 提取表头 head -n 1 your_data_path.tsv > header.tmp # 遍历所有生成的ID文件,追加表头 awk -F '\t' '{file="output_dir/ID"$(NF-1)".csv"; if (!seen[file]++) print header > file; print > file}' header=<(cat header.tmp) your_data_path.tsv # 删除临时表头文件 rm header.tmp
内容的提问来源于stack exchange,提问作者mck
相关产品推荐
相关产品推荐

