如何从S3下载大型csv文件而不会遇到“内存不足”的问题?

时间:2018-08-20 16:56:24

标签: amazon-web-services amazon-s3 boto3

我需要处理存储在S3存储桶中的大文件。我需要将csv文件分成较小的块进行处理。但是,这似乎是在文件系统存储上胜于在对象存储上完成的任务。 因此,我打算将大文件下载到本地,将其分成较小的块,然后将结果文件一起上传到另一个文件夹中。 我知道方法download_fileobj,但无法确定在下载大小约为10GB的大文件时,是否会导致out of memory错误。

4 个答案:

答案 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
        )