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

在AWS SageMaker中用Pandas读取S3大CSV文件的问题求助

解决S3大CSV文件加载到Pandas的内存问题与StreamingBody报错

问题分析

你遇到的两个问题本质上是同一个核心矛盾:小文件的加载方式不适合大文件,同时StreamingBody不符合Pandasread_csv的输入要求。

  • 第一个方法把整个5GB文件读成UTF-8字符串,直接占满内存,显然不可行;
  • 第二个方法直接传递StreamingBody报错,是因为Pandas的read_csv期望的是标准类文件对象(比如io.TextIOWrapper/io.BytesIO),而botocore.response.StreamingBody的接口不完全匹配Pandas的要求。

解决方案1:修复StreamingBody报错(基础版)

把StreamingBody包装成标准的文本流对象,让Pandas可以识别。这样不需要一次性加载全文件到内存,而是逐步读取:

import boto3
import pandas as pd
from io import TextIOWrapper

# 初始化S3客户端
s3 = boto3.client('s3')
# 获取S3对象
obj = s3.get_object(Bucket='grocery', Key='stores.csv')
# 将字节流包装为UTF-8编码的文本流
text_stream = TextIOWrapper(obj['Body'], encoding='utf-8')
# 直接读取CSV
df = pd.read_csv(text_stream)

如果你的CSV是二进制格式(比如有特殊编码),可以用BytesIO包装:

from io import BytesIO

stream = BytesIO(obj['Body'].read())
df = pd.read_csv(stream)

⚠️ 注意:BytesIO(obj['Body'].read())还是会把全文件加载到内存,适合中等大小文件,5GB的话推荐用下面的分块方法。


解决方案2:大文件内存优化(分块读取)

对于5GB的超大CSV,最稳妥的方式是分块读取,避免一次性加载全量数据到内存。结合文本流包装,代码如下:

import boto3
import pandas as pd
from io import TextIOWrapper

s3 = boto3.client('s3')
obj = s3.get_object(Bucket='grocery', Key='stores.csv')
text_stream = TextIOWrapper(obj['Body'], encoding='utf-8')

# 定义每块读取的行数,根据你的内存调整
chunk_size = 10_000

# 遍历每个数据块并处理
for chunk in pd.read_csv(text_stream, chunksize=chunk_size):
    # 在这里添加你的处理逻辑:比如数据清洗、写入数据库、统计计算等
    print(f"处理了{len(chunk)}行数据")
    # example: chunk.to_sql(...)

这种方式每次只把一小部分数据加载到内存,内存占用会大幅降低。


进阶方案:用Dask处理超大规模数据

如果需要对全量数据进行复杂分析,Pandas分块处理会比较繁琐,可以用Dask DataFrame——它可以并行处理分布式数据,自动分块且不需要手动管理内存:

import dask.dataframe as dd
from s3fs import S3FileSystem

# 初始化S3文件系统
s3 = S3FileSystem()
# 直接读取S3上的CSV,Dask会自动分块处理
ddf = dd.read_csv('s3://grocery/stores.csv')

# 执行数据分析操作(比如计算某列均值)
average_value = ddf['your_column'].mean().compute()
print(f"列均值:{average_value}")

Dask的API和Pandas几乎一致,学习成本很低,适合处理TB级别的数据。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:20:23