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

读取25GB大体积CSV文件时内存即将占满该如何规避?

解决方案

问题根因

你当前的代码逻辑是将所有CSV分片全部存入列表后再合并为全量DataFrame,相当于需要将25GB的完整文件全部加载到仅24GB的运行内存中,必然会触发内存溢出(OOM)报错。

实现内存阈值控制方案

前置依赖

使用psutil库获取当前进程的内存占用,安装命令:

pip install psutil

代码实现

以下代码会在每次加载分片前校验当前内存占用,达到20GB阈值时自动停止加载,你也可以在阈值触发分支自定义其他处理逻辑:

import pandas as pd
import psutil
import os

# 内存阈值设置为20GB,转换为字节单位
MEM_THRESHOLD = 20 * 1024 ** 3
# 获取当前Python进程对象
current_process = psutil.Process(os.getpid())

df_list = []
chunksize = 100000
load_stop = False

for chunk in pd.read_csv(path, chunksize=chunksize):
    # 获取当前进程已使用的物理内存大小
    used_mem = current_process.memory_info().rss
    if used_mem >= MEM_THRESHOLD:
        # 此处可替换为自定义处理逻辑,如将已加载数据存盘、清理冗余缓存后继续加载等
        print(f"内存占用已达{used_mem / 1024**3:.2f}GB,触发阈值停止加载")
        load_stop = True
        break
    df_list.append(chunk)

# 仅当加载未被中断时合并全量DataFrame
if not load_stop:
    X = pd.concat(df_list)

优化建议

  • 若非必须使用全量DataFrame进行计算,建议直接在chunk迭代阶段完成数据清洗、过滤、聚合等操作,无需将所有分片存入内存,从根源避免内存溢出问题
  • 可根据单分片的实际内存占用动态调整chunksize参数,进一步优化内存使用效率
  • 如果后续需要使用全量数据,可在迭代时将预处理后的分片写入磁盘的Parquet格式文件,后续按需读取分片即可

内容的提问来源于stack exchange,提问作者Tawan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.12 19:57:01