将大熊猫DataFrame保存到S3的最快方法是什么?

pma*_*a93 4 amazon-s3 python-3.x pandas

我正在尝试找出将大熊猫DataFrame写入S3文件系统的最快方法。我目前正在尝试两种方法:

1)通过gzip压缩(BytesIO)和boto3

gz_buffer = BytesIO()

with gzip.GzipFile(mode='w', fileobj=gz_buffer) as gz_file:
    df.to_csv(TextIOWrapper(gz_file, 'utf8'), index=False)

s3_resource = boto3.resource('s3')
s3_object = s3_resource.Object(bucket, s3_path + name_zip)
s3_object.put(Body=gz_buffer.getvalue())
Run Code Online (Sandbox Code Playgroud)

对于700万行的数据帧,大约需要420秒才能写入S3。

2)通过不压缩即可写入csv文件(StringIO缓冲区)

csv_buffer = StringIO()
data.to_csv(csv_buffer)
s3_resource = boto3.resource('s3')
s3_resource.Object(bucket, s3_path + name_csv).put(Body=csv_buffer.getvalue())
Run Code Online (Sandbox Code Playgroud)

大约需要371秒...

问题是:还有其他更快的方法可以将熊猫数据帧写入S3吗?

小智 6

使用分段上传可以更快地传输到S3。压缩会使文件更小,因此也有帮助。

import boto3
s3 = boto3.client('s3')

csv_buffer = BytesIO()
df.to_csv(csv_buffer, compression='gzip')

# multipart upload
# use boto3.s3.transfer.TransferConfig if you need to tune part size or other settings
s3.upload_fileobj(csv_buffer, bucket, key)
Run Code Online (Sandbox Code Playgroud)

的文档s3.upload_fileobj在这里:https : //boto3.amazonaws.com/v1/documentation/api/latest/reference/services/s3.html#S3.Client.upload_fileobj

  • 您的代码给了我“TypeError:需要一个类似字节的对象,而不是‘str’”。任何建议表示赞赏。 (11认同)
  • 对于“TypeError:需要类似字节的对象,而不是“str””,“StringIO”而不是“BytesIO”对我有用 (2认同)
  • @Raksha你需要`csv_buffer.seek(0)`来倒回缓冲区。 (2认同)