Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/amazon-web-services/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用python将S3 gzip源对象流式解压缩到S3目标对象?_Python_Amazon Web Services_Amazon S3_Gzip_Boto3 - Fatal编程技术网

使用python将S3 gzip源对象流式解压缩到S3目标对象?

使用python将S3 gzip源对象流式解压缩到S3目标对象?,python,amazon-web-services,amazon-s3,gzip,boto3,Python,Amazon Web Services,Amazon S3,Gzip,Boto3,如果S3中有一个大的gzip对象,python3/boto3中的内存有效(例如流)方法是什么来解压缩数据并将结果存储回另一个S3对象? 有一个以前问过的问题。但是,所有答案都使用一种方法,即首先将gzip文件的内容读入内存(例如,ByteIO)。对于太大而无法放入主内存的对象,这些解决方案是不可行的 对于大型S3对象,需要以分块的方式读取、解压缩内容,然后将其写入不同的S3对象 提前感谢您的考虑和回复。您可以将流媒体方法与boto/s3一起使用,但您必须定义自己的类似文件的对象。 幸运的是,有一

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

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

对于大型S3对象,需要以分块的方式读取、解压缩内容,然后将其写入不同的S3对象


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

您可以将流媒体方法与boto/s3一起使用,但您必须定义自己的类似文件的对象。
幸运的是,有一个能帮你解决这个问题的方法;它还支持GCS、Azure、HDFS、SFTP和其他功能。
下面是一个使用大量销售数据的示例:

导入boto3
从智能打开导入打开
session=boto3.session()#如果您的环境中没有设置身份验证凭据,则需要在此处设置身份验证凭据
块大小=1024*1024#1 MB
f_in=open(“s3://mybucket/2m_sales\u records.csv.gz”,transport\u params=dict(session=session),encoding=“utf-8”)
f_out=open(“s3://mybucket/2m_sales_records.csv”,“w”,transport_params=dict(session=session))
字节计数=0
尽管如此:
数据=f_in.读取(块大小)
如果没有数据:
打破
f_out.写入(数据)
字节计数+=len(数据)
打印(f“迄今已写入{byte_count}字节”)
f_in.close()
f_out.close()
示例文件有200万行行,压缩后的75 MB238 MB未压缩。
我将压缩文件上传到
mybucket
并运行代码,下载文件,提取内存中的内容,并将未压缩的数据上传回S3。
在我的电脑上,这个过程大约花费了78秒(高度依赖于互联网连接速度),并且从未使用超过95 MB的内存;我认为,如果需要,您可以通过在smart\u open中覆盖S3多部分上传的部件大小来降低内存需求

DEFAULT\u minu\u PART\u SIZE=50*1024**2
“”“S3多部分上载的默认最小部分大小”“”
最小最小零件尺寸=5*1024**2
“”“亚马逊允许的绝对最小值。”“”

的批准答案在哪些方面不能解决您的问题?如果您运行的是Python 3,则for循环将充当生成器,因此解压将以流式方式进行。@Tim它需要绑定到boto3 for S3接口。您愿意使用多少内存?对于流式传输,您将始终需要使用一些内存,因为多部分上载API需要在每个部分的请求头中发送内容校验和-您将需要一个内存缓冲区,至少在
part\u size
*
n\u concurrent\u parts
的大致范围内。您需要流式传输而不是简单地使用临时文件,这有什么原因吗?Boto3通过meta.client.download_文件为您处理这个问题。请参阅答案。@wim我不是要求内存使用率为0,而是要求消耗的内存不随文件大小而增长。我想一个临时文件可以工作,尽管它效率很低。