boto3
を使用して、boto3
を使用して、boto
を再度使用してみましょう。 S3からファイルをダウンロードし、gzipしてS3に再アップロードするにはどうすればファイルがディスクに書き込まれますか?Boto3 gzipをダウンロードしてストリームとしてアップロード
S3にアップロードされたすべてのコンテンツをGzipsするAWSラムダ関数を記述しようとしています。問題はラムダ関数が512MBのディスクスペースに制限されていることで、アップロードがこれをはるかに超えている可能性があります。
私の前提として、ストリームを使用してこれを行うことができます。どんな助けでも大歓迎です!ありがとう。
[更新日]
以下のコードが動作します。チャンクをS3にアップロードすると、*.gz
ファイルが表示されます。しかし、gzipヘッダーは正しく追加されていません。ファイルを開くと、MAC Error 32 - Broken Pipe
になります。興味深いことに、ファイルサイズがCHUNK_SIZE
より小さい場合、すなわち反復が1回だけである場合、ファイルはアップロードされ、壊れていない。
私は間違っていますか?
CHUNK_SIZE = 10000000
gz_buffer = io.BytesIO()
gz_stream = gzip.GzipFile(fileobj=gz_buffer, mode='wb', compresslevel=9)
obj = resource.Object(bucket, key)
body = obj.get()['Body']
try:
while True:
data = body.read(CHUNK_SIZE)
if data:
compressed_bytes = gz_stream.write(data)
if compressed_bytes < CHUNK_SIZE:
gz_stream.close()
cdata = gz_buffer.getvalue()[0:compressed_bytes]
# Upload cdata as multipart upload
# This is a little helper function that
# uses boto3 create_multipart_upload
multipart.upload(cdata)
else:
# Signal to S3 complete multipart upload
multipart.complete()
break
except Exception as e:
pass
は 'io.BytesIO'を使用します。私はあなたのコードなしでもっと説明することはできません。 –
基本的なコードに感謝しました。 – chasez0r
今質問は良いです。 –