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

如何借助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__

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 14:02:39