【问题标题】:How to download large csv files from S3 without running into 'out of memory' issue?如何从 S3 下载大型 csv 文件而不会遇到“内存不足”问题?
【发布时间】:2020-09-24 02:36:38
【问题描述】:

我需要处理存储在 S3 存储桶中的大文件。我需要将 csv 文件分成更小的块进行处理。但是,这似乎是在文件系统存储上而不是在对象存储上做得更好的任务。 因此,我打算将大文件下载到本地,将其分成较小的块,然后将生成的文件一起上传到不同的文件夹中。 我知道 download_fileobj 方法,但无法确定在下载 ~= 10GB 的大文件时是否会导致 out of memory 错误。

【问题讨论】:

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


    【解决方案1】:

    我建议使用download_file():

    import boto3
    s3 = boto3.resource('s3')
    s3.meta.client.download_file('mybucket', 'hello.txt', '/tmp/hello.txt')
    

    下载时不会内存不足。 Boto3 将负责传输过程。

    【讨论】:

      【解决方案2】:

      您可以为此使用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

      【讨论】:

        【解决方案3】:

        你可以试试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
        

        【讨论】:

        • 这会造成麻烦,因为有时在 CSV 文件中,一行中可能有换行符,熊猫可以处理,但逐行流式处理不能。
        • 从来没有遇到过这样的情况,我想也可以这样。尝试使用此文本形成 CSV。 a,b C \n,d
        • 是的,我遇到了这个问题,因此陈述了上述经验。需要注意的一点是 row != line.
        【解决方案4】:

        您可以通过并发 S3 API 传输调用来增加带宽使用率

                config = TransferConfig(max_concurrency=150)
        
                s3_client.download_file(
                    Bucket=s3_bucket,
                    Filename='path',
                    Key="key",
                    Config=config
                )
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2016-01-17
          • 2012-02-15
          • 1970-01-01
          • 1970-01-01
          • 2014-03-03
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多