gpt4 book ai didi

python-3.x - 使用boto3 lib和AWS Lambda从坐在S3存储桶中的压缩文件中获取数据流

转载 作者:行者123 更新时间:2023-12-04 12:17:01 30 4
gpt4 key购买 nike

我正在尝试为我的chron作业创建一个无服务器处理器,在此作业中,我从一个客户的S3存储桶中收到一个压缩文件,该文件的大小约为50MB,但是一旦解压缩,它的大小就会变成1.5GB,并且有由于我无法从S3存储桶下载此文件并将其解压缩到Lambda上,因此对AWS Lambda的可用空间存在严格限制,即500MB,我能够使用funzip成功解压缩文件并从S3逐行流传输内容在Unix脚本中。

for x in $files ; do echo -n "$x: " ; timeout 5 aws s3 cp $monkeydir/$x - | funzip

我的存储桶名称: MonkeyBusiness key : /Daily/Business/Banana/{current-date}对象: banana.zip
但是现在,由于我正尝试使用boto3实现相同的输出,因此我如何将压缩后的内容流传输到sys i/o并解压缩该流,将内容保存在单独的文件中(每个文件由10000行划分),然后将分块的文件上传回S3。
需要指导,因为我是AWS和boto3的新手。

如果您需要有关该工作的更多详细信息,请告诉我。

下面给出的建议解决方案在这里不适用,因为zlib文档明确指出所说的lib与gzip文件格式兼容,而我的问题是与zip文件格式兼容。
import zlib

def stream_gzip_decompress(stream):
dec = zlib.decompressobj(32 + zlib.MAX_WBITS) # offset 32 to skip the header
for chunk in stream:
rv = dec.decompress(chunk)
if rv:
yield rv

最佳答案

因此,我使用BytesIO将压缩文件读取到缓冲区对象中,然后使用zipfile将解压缩的流作为未压缩的数据打开,并且能够逐行获取数据。

import io
import zipfile
import boto3
import sys

s3 = boto3.resource('s3', 'us-east-1')


def stream_zip_file():
count = 0
obj = s3.Object(
bucket_name='MonkeyBusiness',
key='/Daily/Business/Banana/{current-date}/banana.zip'
)
buffer = io.BytesIO(obj.get()["Body"].read())
print (buffer)
z = zipfile.ZipFile(buffer)
foo2 = z.open(z.infolist()[0])
print(sys.getsizeof(foo2))
line_counter = 0
for _ in foo2:
line_counter += 1
print (line_counter)
z.close()


if __name__ == '__main__':
stream_zip_file()

关于python-3.x - 使用boto3 lib和AWS Lambda从坐在S3存储桶中的压缩文件中获取数据流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46058605/

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