为了账号安全,请及时绑定邮箱和手机立即绑定

AWS S3 下载程序内存不足

AWS S3 下载程序内存不足

Go
慕姐4208626 2022-08-24 10:30:45
我在使用 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在应用程序运行时使用的内存。我不知道在我的情况下哪个可能是最好的解决方案,你有什么建议?我感谢任何建议或推荐,非常感谢你提前!
查看完整描述

1 回答

?
一只名叫tom的猫

TA贡献1906条经验 获得超3个赞

通过使用,您无法在下载文件时处理文件:它同时下载不同的块,因此您不会按顺序接收字节。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)


查看完整回答
反对 回复 2022-08-24
  • 1 回答
  • 0 关注
  • 127 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信