AWS S3 下载程序内存不足

我在使用 golang 客户端从 AWS S3 存储桶下载大文件时遇到问题,我不是 golang 方面的专家,因此我非常感谢任何帮助。


我正在创建一个简单的 API,该 API 使用 gin-gonic 框架公开一个终端节点,当有人向该终端节点发送请求时,应用程序会从 AWS S3 存储桶下载一个巨大的 CSV 文件,并将文件的内容保存在本地数据库中。


当文件大小为200 mb时,它可以正常工作,但是对于较大的文件,例如500 mb,我开始出现内存错误。


我正在使用这部分代码来创建会话并卸载文件:


sess, _ := session.NewSession(&aws.Config{

    Region: aws.String("us-west-2")},

)


downloader := s3manager.NewDownloader(sess)


getInput := &s3.GetObjectInput{

    Bucket: aws.String("the bucket name"),

    Key:    aws.String("the file path"),

}


buff := new(aws.WriteAtBuffer)


_, err := downloader.Download(buff, getInput)


if err != nil {    

        return nil, errors.New(err, "error downloading file")

}


return buff.Bytes(), nil

在这部分之后,我有一个服务,它接收字节并使用golang CSV阅读器迭代文件内容:


csv.NewReader(bytes.NewReader(theBytes))

在读取器接收字节之前下载文件内容时,会出现此问题。

我的问题是,是否有任何方法可以使用不同的方法来下载代码中的文件(也许在下载器上具有不同的设置)来解决此问题,或者...相反,如果我需要拆分存储桶中的文件内容以减小大小并按部分下载文件。

另一种选择可能是增加golang在应用程序运行时使用的内存。

我不知道在我的情况下哪个可能是最好的解决方案,你有什么建议?

我感谢任何建议或推荐,非常感谢你提前!


慕姐4208626
浏览 128回答 1
1回答

一只名叫tom的猫

通过使用,您无法在下载文件时处理文件:它同时下载不同的块,因此您不会按顺序接收字节。downloader如果要在下载字节时对其进行处理,可以尝试改用。这将按顺序下载对象,但仅使用单个 goroutine,因此速度会变慢。s3.S3像这样:    sess, _ := session.NewSession(&aws.Config{        Region: aws.String("us-west-2")},    )    s3Client := s3.New(sess)    getInput := &s3.GetObjectInput{        Bucket: aws.String("the bucket name"),        Key:    aws.String("the file path"),    }    resp, err := s3Client.GetObjectWithContext(context.TODO(), getInput)    if err != nil {        return nil, fmt.Errorf("error downloading file: %v", err)    }    defer resp.Body.Close()    rd := csv.NewReader(resp.Body)
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go