【问题标题】:Streaming decompression of S3 gzip source object to a S3 destination object using python?使用 python 将 S3 gzip 源对象流式解压缩到 S3 目标对象?
【发布时间】:2020-10-20 17:42:08
【问题描述】:

给定 S3 中的大型 gzip 对象,python3/boto3 中的内存高效(例如流式传输)方法来解压缩数据并将结果存储回另一个 S3 对象是什么? p>

之前有人问过similar question。但是,所有答案都使用了一种方法,其中首先将 gzip 文件的内容读入内存(例如ByteIO)。这些解决方案对于太大而无法放入主内存的对象是不可行的。

对于大型 S3 对象,需要读取内容,“即时”解压缩,然后写入不同的 S3 对象,这是一种分块方式。

提前感谢您的考虑和回复。

【问题讨论】:

  • this question 的批准答案在哪些方面不能解决您的问题?如果您正在运行 Python 3,for 循环将充当生成器,因此解压缩将被流式传输。
  • @Tim S3接口需要绑定boto3。
  • 你愿意使用多少内存?对于流传输,您总是需要使用一些内存,因为多部分上传 API 需要在请求 headers 中为每个部分发送内容校验和 - 您至少需要一个内存缓冲区在 @ 的范围内987654325@ * n_concurrent_parts。您是否有任何理由需要流式传输,而不是简单地使用临时文件?
  • Boto3 使用 meta.client.download_file 为您处理这个问题。见答案。
  • @wim 我不是要求 0 内存使用量,但我要求消耗的内存不会随着文件的大小而增长。我想一个临时文件可以工作,虽然它非常低效。

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


【解决方案1】:

您可以通过 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 秒(高度依赖于 Internet 连接速度)并且从未使用超过 95 MB 的内存;如果需要,我认为您可以通过在 smart_open 中覆盖 S3 分段上传的 part size 来降低内存要求。

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."""

【讨论】:

  • 在哪一行抛出异常?你有一个示例文件来复制问题吗?
  • 抱歉,想通了 - 这是二进制数据
猜你喜欢
  • 2021-11-15
  • 2021-07-22
  • 1970-01-01
  • 1970-01-01
  • 2016-10-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多