我需要处理存储在S3存储桶中的大文件。我需要将csv文件分成较小的块进行处理。但是,这似乎是在文件系统存储上胜于在对象存储上完成的任务。
因此,我打算将大文件下载到本地,将其分成较小的块,然后将结果文件一起上传到另一个文件夹中。
我知道方法download_fileobj
,但无法确定在下载大小约为10GB的大文件时,是否会导致out of memory
错误。
答案 0 :(得分:1)
我建议使用download_file()
:
import boto3
s3 = boto3.resource('s3')
s3.meta.client.download_file('mybucket', 'hello.txt', '/tmp/hello.txt')
下载时不会用完内存。 Boto3将负责转移过程。
答案 1 :(得分:0)
您可以使用awscli
命令行执行此操作。流输出如下:
aws s3 cp s3://<bucket>/file.txt -
以上命令将在终端中流式传输文件内容。然后,您可以使用split
和/或tee
命令创建文件块。
示例:aws s3 cp s3://<bucket>/file.txt - | split -d -b 100000 -
此答案的更多详细信息:https://stackoverflow.com/a/7291791/2732674
答案 2 :(得分:0)
您可以尝试boto3 s3.Object api。
import boto3
s3 = boto3.resource('s3')
object = s3.Object('bucket_name','key')
body = object.get()['Body'] #body returns streaming string
for line in body:
print line
答案 3 :(得分:0)
您可以通过同时进行S3 API传输调用来增加带宽使用量
config = TransferConfig(max_concurrency=150)
s3_client.download_file(
Bucket=s3_bucket,
Filename='path',
Key="key",
Config=config
)