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

如何从SageMaker直接写入数据到S3,避免存储在Jupyter实例本地

如何直接将Pandas DataFrame上传到S3而不在本地保存文件?

你当前的代码会先把DataFrame写入本地CSV文件,再上传到S3,这就是Jupyter实例工作目录中出现文件的原因。要实现无本地文件直接上传,可以利用内存字节流(BytesIO)处理数据,直接将DataFrame的CSV内容上传到S3。

修改后的完整代码

import os
import pandas as pd
import io  # 新增:用于内存流处理
import sagemaker, boto3
from sagemaker import get_execution_role
from sagemaker.inputs import TrainingInput
from sagemaker.serializers import CSVSerializer

# 配置S3桶和路径
bucket = "test-bucket2342343"
sm_sess = sagemaker.Session(default_bucket=bucket)
file_path = "Use Cases/Sagemaker Demo/xgboost"

# 生成数据
df_train = pd.DataFrame({'X':[0,100,200,400,450,  550,600,800,1600],
                         'y':[0,0,  0,  0,  0,    1,  1,  1,  1]})

df_test = pd.DataFrame({'X':[10,90,240,459,120,  650,700,1800,1300],
                        'y':[0,0,  0,  0,  0,    1,  1,  1,  1]})

# 直接上传到S3,不保存本地文件
s3_resource = boto3.Session().resource("s3")

# 处理训练数据
train_csv_buffer = io.BytesIO()
df_train[['y','X']].to_csv(train_csv_buffer, header=False, index=False)
train_csv_buffer.seek(0)  # 将指针移到流的开头,准备读取
s3_resource.Bucket(bucket).Object(os.path.join(file_path, "train.csv")).put(Body=train_csv_buffer)

# 处理验证数据
val_csv_buffer = io.BytesIO()
df_test[['y','X']].to_csv(val_csv_buffer, header=False, index=False)
val_csv_buffer.seek(0)
s3_resource.Bucket(bucket).Object(os.path.join(file_path, "val.csv")).put(Body=val_csv_buffer)

关键说明

  • 内存流处理:使用io.BytesIO()创建内存中的字节流,替代本地文件存储。to_csv直接写入这个内存流,不会在磁盘生成文件。
  • 指针重置:写入流后需要调用seek(0),将读取指针移到流的起始位置,确保put方法能读取到完整的CSV内容。
  • 直接上传:使用S3资源的put(Body=...)方法,直接将内存中的字节流上传到指定S3路径,无需依赖本地文件。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 19:06:32