我在使用 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)
- 1 回答
- 0 关注
- 127 浏览
添加回答
举报
0/150
提交
取消