如何从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
相关产品推荐
相关产品推荐

