如何借助chunksize迭代器重构pandas大文件处理代码?
使用Pandas迭代器处理eggNOG大文件解决内存瓶颈
问题背景
用Pandas解析生物信息学工具eggNOG生成的大文件时遭遇内存瓶颈,无法完成全量处理。计划通过Pandas的chunksize参数启用迭代器分块处理,需要实现以下操作:
- 删除
['score', 'evalue', 'Description', 'EC', 'PFAMs']列 - 将所有
'-'替换为np.nan - 将处理后的数据写入完整输出文件
原非迭代处理代码:
df.drop(['score', 'evalue', 'Description', 'EC', 'PFAMs'],axis=1).replace('-', np.nan) df.to_csv('my.csv',sep='\t',index=False)
解决方案
1. 从源头避免加载冗余数据
读取文件时直接指定需要保留的列,而非加载全量数据后再删除冗余列,能大幅降低内存占用。可先读取表头获取列名,筛选出需要保留的列后,用usecols参数加载指定列。
2. 分块处理并持续写入输出文件
在分块循环外部保持输出文件的打开状态,避免频繁IO操作;处理每个分块后写入文件,注意仅第一块写入表头。
完整处理代码:
import pandas as pd import numpy as np # 先读取表头,筛选需要保留的列 all_cols = pd.read_csv('myinfile.csv', sep="\t", nrows=1).columns keep_cols = [col for col in all_cols if col not in ['score', 'evalue', 'Description', 'EC', 'PFAMs']] # 打开输出文件,分块处理写入 with open('my.csv', 'w', newline='') as outfile: # 分块读取,chunksize可根据内存调整 for chunk_idx, chunk in enumerate(pd.read_csv('myinfile.csv', sep="\t", chunksize=1000, usecols=keep_cols)): # 替换'-'为np.nan processed_chunk = chunk.replace('-', np.nan) # 仅第一块写入表头 processed_chunk.to_csv(outfile, sep='\t', index=False, header=(chunk_idx == 0))
3. 处理分块导致的重复项
若数据拆分到不同分块导致输出文件存在重复项,可通过分组聚合求和去重:
# 读取处理后的文件去重 df = pd.read_csv('my.csv', sep="\t") df = df.groupby(['compoundIndex'])['Frequency'].sum().reset_index() # 写入去重后的最终文件 df.to_csv('my_deduped.csv', sep='\t', index=False)
说明
- 调整
chunksize参数可适配不同内存瓶颈:值越大处理速度越快,同时内存占用越高,可根据机器配置灵活调整。 - 该方案输出结果与非迭代处理完全一致,已适配至复杂的面向对象解析模块。
内容的提问来源于stack exchange,提问作者M__
相关产品推荐
相关产品推荐

