gpt4 book ai didi

amazon-web-services - 通过 Golang SDK 将大文件发送到 Amazon S3 时如何使用更少的内存?

转载 作者:IT王子 更新时间:2023-10-29 00:39:06 24 4
gpt4 key购买 nike

我在 golang 上使用 AWS SDK 发送大型备份文件 (2GB~10GB)。

进程启动时会消耗大量内存。我知道这是因为代码将文件读取到缓冲区,但我是 Go 的新手,我不知道如何更改它。

这是我用来读取文件并发送到 AWS S3 uploader 的代码:

file, err := os.Open(file_to_upload)

file_name := getFileName(file_to_upload)

if err != nil {
fmt.Println(err)
os.Exit(1)
}
defer file.Close()

fileInfo, _ := file.Stat()
var size int64 = fileInfo.Size()

buffer := make([]byte, size)

file.Read(buffer)

fileBytes := bytes.NewReader(buffer)

fileType := http.DetectContentType(buffer)

upparams := &s3manager.UploadInput{
Bucket: &bucket,
Key: &file_name,
Body: fileBytes,
ACL: aws.String("private"),
ContentType: aws.String(fileType),
Metadata: map[string]*string{
"Key": aws.String("MetadataValue"), //required
},
}

result, err := uploader.Upload(upparams, func(u *s3manager.Uploader){
if partsize != 0{
u.PartSize = int64(partsize) * 1024 * 1024
}
u.LeavePartsOnError = false
u.Concurrency = parallel
})

```

到目前为止我测试了什么。

修改:将 u.Concurrency 从 5 更改为 3:结果:CPU:从 26% 减少到 21% 内存:使用相同

修改:将 u.Concurrency 从 5 更改为 2:结果:CPU:从 26% 减少到 20% 内存:使用相同

修改:将 u.Concurrency 从 5 更改为 3,将 u.Partsize 更改为 100MB:结果:CPU:从 26% 减少到 16% 内存:使用相同

时间不是这里的问题,而是内存消耗。

我想以尽可能少的资源进行调整。我该如何处理?

最佳答案

没有理由将整个文件读入内存。只需为文件本身提供 Body 字段

upparams := &s3manager.UploadInput{
Bucket: &bucket,
Key: &file_name,

// *os.File is an io.Reader
Body: file,

ACL: aws.String("private"),
ContentType: aws.String(fileType),
Metadata: map[string]*string{
"Key": aws.String("MetadataValue"), //required
},
}

关于amazon-web-services - 通过 Golang SDK 将大文件发送到 Amazon S3 时如何使用更少的内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37469912/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com