亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

使用 python 將 S3 gzip 源對象流式解壓縮到 S3 目標對象?

使用 python 將 S3 gzip 源對象流式解壓縮到 S3 目標對象?

弒天下 2023-12-09 15:59:49
給定 S3 中的一個大gzip對象,python3/boto3 中的內存高效(例如流式傳輸)方法是什么來解壓縮數據并將結果存儲回另一個 S3 對象?之前也有人問過類似的問題。然而,所有答案都使用一種方法,其中首先將 gzip 文件的內容讀入內存(例如ByteIO)。這些解決方案對于太大而無法放入主內存的對象來說是不可行的。對于大型 S3 對象,需要讀取內容,“即時”解壓縮,然后以某種分塊方式寫入不同的 S3 對象。預先感謝您的考慮和回復。
查看完整描述

1 回答

?
躍然一笑

TA貢獻1826條經驗 獲得超6個贊

您可以將流方法與boto / s3一起使用,但您必須定義自己的類文件對象 AFAIK。
幸運的是,有smart_open可以幫你處理這個問題;它還支持GCS、Azure、HDFS、SFTP等。以下是使用大量銷售數據樣本
的 示例:

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的內存;我認為如果需要的話,您可以通過覆蓋smart_open中 S3 分段上傳的部分大小來降低內存要求。


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


查看完整回答
反對 回復 2023-12-09
  • 1 回答
  • 0 關注
  • 176 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號