gpt4 book ai didi

python - 如何在使用 boto 上传到 s3 时进行 gzip

转载 作者:太空狗 更新时间:2023-10-29 18:15:42 28 4
gpt4 key购买 nike

我有一个很大的本地文件。我想使用 boto 库将该文件的 gzip 版本上传到 S3。该文件太大,无法在上传前将其有效地 gzip 到磁盘上,因此应在上传期间以流式方式 gzip。

boto 库知道一个函数 set_contents_from_file(),它需要一个它将从中读取的类似文件的对象。

gzip 库知道类GzipFile 可以通过名为fileobj 的参数获取对象;压缩时会写入这个对象。

我想把这两个功能结合起来,但是一个API想自己读,另一个API想自己写;两者都不知道被动操作(如写入或读取)。

有没有人知道如何以有效的方式将它们结合起来?

编辑:我接受了一个答案(见下文),因为它提示我去哪里,但如果你有同样的问题,你可能会发现我自己的答案(也在下面)更有帮助,因为我使用 multipart 实现了一个解决方案在其中上传。

最佳答案

我实现了 garnaat 接受的答案的评论中暗示的解决方案:

import cStringIO
import gzip

def sendFileGz(bucket, key, fileName, suffix='.gz'):
key += suffix
mpu = bucket.initiate_multipart_upload(key)
stream = cStringIO.StringIO()
compressor = gzip.GzipFile(fileobj=stream, mode='w')

def uploadPart(partCount=[0]):
partCount[0] += 1
stream.seek(0)
mpu.upload_part_from_file(stream, partCount[0])
stream.seek(0)
stream.truncate()

with file(fileName) as inputFile:
while True: # until EOF
chunk = inputFile.read(8192)
if not chunk: # EOF?
compressor.close()
uploadPart()
mpu.complete_upload()
break
compressor.write(chunk)
if stream.tell() > 10<<20: # min size for multipart upload is 5242880
uploadPart()

它似乎没有问题。毕竟,流媒体在大多数情况下只是数据的分 block 。在这种情况下, block 大约有 10MB 大,但谁在乎呢?只要我们不是在谈论几个 GB 的 block ,我就可以接受。


Python 3 更新:

from io import BytesIO
import gzip

def sendFileGz(bucket, key, fileName, suffix='.gz'):
key += suffix
mpu = bucket.initiate_multipart_upload(key)
stream = BytesIO()
compressor = gzip.GzipFile(fileobj=stream, mode='w')

def uploadPart(partCount=[0]):
partCount[0] += 1
stream.seek(0)
mpu.upload_part_from_file(stream, partCount[0])
stream.seek(0)
stream.truncate()

with open(fileName, "rb") as inputFile:
while True: # until EOF
chunk = inputFile.read(8192)
if not chunk: # EOF?
compressor.close()
uploadPart()
mpu.complete_upload()
break
compressor.write(chunk)
if stream.tell() > 10<<20: # min size for multipart upload is 5242880
uploadPart()

关于python - 如何在使用 boto 上传到 s3 时进行 gzip,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15754610/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com