python - 使用python将S3 gzip源对象流式解压到S3目标对象?

标签 python amazon-web-services amazon-s3 gzip boto3

给定一个大 gzip S3 中的对象,python3/boto3 中用于解压缩数据并将结果存储回另一个 S3 对象的内存高效(例如流)方法是什么?
有一个similar question之前问过。但是,所有答案都使用一种方法,其中首先将 gzip 文件的内容读入内存(例如 ByteIO )。对于太大而无法放入主内存的对象,这些解决方案是不可行的。
对于大型 S3 对象,需要读取内容,“即时”解压缩,然后以某种分块方式写入不同的 S3 对象。
预先感谢您的考虑和回应。

最佳答案

您可以通过 使用流方法boto/s3 但是你必须定义你自己的类似文件的对象 AFAIK。
幸运的是有 smart_open它为您处理;它还支持 GCS、Azure、HDFS、SFTP 等。
这是一个使用大 sample 的示例销售数据:

import boto3
from smart_open import open

session = boto3.Session()  # you need to set auth credentials here if you don't have them set in your environment
chunk_size = 1024 * 1024  # 1 MB
f_in = open("s3://mybucket/2m_sales_records.csv.gz", transport_params=dict(session=session), encoding="utf-8")
f_out = open("s3://mybucket/2m_sales_records.csv", "w", transport_params=dict(session=session))
byte_count = 0
while True:
    data = f_in.read(chunk_size)
    if not data:
        break
    f_out.write(data)
    byte_count += len(data)
    print(f"wrote {byte_count} bytes so far")
f_in.close()
f_out.close()
示例文件有 200万线,它是 75 MB 压缩和 238 MB 未压缩。
我将压缩文件上传到 mybucket并运行下载文件的代码,提取内存中的内容并将未压缩的数据上传回 S3。
在我的电脑上,这个过程大约花了 78 秒 (高度依赖互联网连接速度)并且从未使用超过 95 MB 内存力;我认为如果需要,您可以通过覆盖 中 S3 分段上传的部分大小来降低内存要求。 smart_open .
DEFAULT_MIN_PART_SIZE = 50 * 1024**2
"""Default minimum part size for S3 multipart uploads"""
MIN_MIN_PART_SIZE = 5 * 1024 ** 2
"""The absolute minimum permitted by Amazon."""

关于python - 使用python将S3 gzip源对象流式解压到S3目标对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64450604/

相关文章:

amazon-web-services - 循环创建 S3 文件 - Node.JS + AWS-SDK

amazon-s3 - s3 永无止境的待处理音频请求

amazon-web-services - Amazon AWS Filezilla 传输权限被拒绝

python - 此 sqlite3 查询的正确格式是什么? (Python)

Python装饰器与传递函数

python - 计算由空格分隔的未指定数量的整数并使用字典查找 python 中每个数字的出现次数

amazon-web-services - 在 boto 中获取 SQS 消息状态

amazon-web-services - 使用 EC2 命令行工具选择免费层级 Amazon 系统镜像 (AMI)

python - 如何选择下拉选项 1 并搜索直到最后一个选项,一旦页面重新加载,下一次循环失败,找到下拉选项

amazon-web-services - 使用 CDK 重定向 S3 存储桶部署的请求被拒绝访问