当前位置:首页>python>Python:Pandas 大文件分块处理实战,解决内存OOM崩溃

Python:Pandas 大文件分块处理实战,解决内存OOM崩溃

  • 2026-09-06 07:20:03
Python:Pandas 大文件分块处理实战,解决内存OOM崩溃
业务中动辄GB级的CSV日志、业务流水文件,直接read_csv全量读取极易触发内存溢出程序崩溃。本篇讲解Pandas分块迭代读取、分块清洗、分块聚合,不把全部数据加载进内存,实现低内存处理超大文本数据集。
场景:处理10GB订单流水csv文件,机器可用内存只有4G,不能一次性全部载入内存。需要过滤无效数据,统计每个地区订单总金额,输出汇总结果,不需要保存全部原始数据。

代码示例

import pandas as pdimport numpy as np# 1. 统一定义数据长度,确保所有字段绝对对齐(避免长度不一致报错)n_rows = 200000# 2. 生成模拟测试数据,字段:order_id, area, amount, order_timemock_data = pd.DataFrame({    "order_id": np.arange(1, n_rows + 1),    "area": np.random.choice(["华北", "华东", "华南", "西南"], size=n_rows),    "amount": np.round(np.random.uniform(10, 5000, size=n_rows), 2),    "order_time": pd.date_range(start="2026-01-01", periods=n_rows, freq="1min")})mock_data.to_csv("large_order.csv", index=False)# 3. 分块处理逻辑(使用列表收集结果,避免循环中频繁concat导致性能损耗)chunk_iter = pd.read_csv("large_order.csv", chunksize=20000)chunk_results = []for chunk in chunk_iter:    # 过滤:金额大于0的有效订单    valid = chunk[chunk["amount"] > 0]    # 分块内聚合    chunk_agg = valid.groupby("area")["amount"].sum().reset_index()    chunk_results.append(chunk_agg)# 4. 合并分块结果,再次聚合得到最终统计total_result = pd.concat(chunk_results, ignore_index=True)final_stat = total_result.groupby("area")["amount"].sum().reset_index()# 禁用科学计数法,保留两位小数,方便查看大数值pd.set_option('display.float_format', lambda x: '%.2f' % x)print(final_stat)
输出结果

核心总结

  1. chunksize设置合适块大小,不是越大越好,根据内存调试;
  2. 尽量在分块内部做过滤,减少内存数据量;
  3. 分块聚合后,只保存聚合结果,不保存原始全量数据;
  4. 不要在循环内频繁concat完整大DataFrame,只拼接统计结果。

最新文章

随机文章