Amazon web services 如何在通过Golang SDK向Amazon S3发送大文件时使用更少的内存?
我在golang上使用AWS SDK发送大型备份文件(2GB~10GB) 当进程开始时,会消耗大量内存。我知道这是因为代码将文件读取到缓冲区,但我是新手,我不知道如何更改它 这是我用来读取文件并发送到AWS S3上传程序的代码:Amazon web services 如何在通过Golang SDK向Amazon S3发送大文件时使用更少的内存?,amazon-web-services,memory,go,amazon-s3,Amazon Web Services,Memory,Go,Amazon S3,我在golang上使用AWS SDK发送大型备份文件(2GB~10GB) 当进程开始时,会消耗大量内存。我知道这是因为代码将文件读取到缓冲区,但我是新手,我不知道如何更改它 这是我用来读取文件并发送到AWS S3上传程序的代码: file, err := os.Open(file_to_upload) file_name := getFileName(file_to_upload) if err != nil { fmt.Println(err) os.Exit(1) } d
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.并发从5更改为3:
结果:CPU:内存使用率从26%降至21%
修改:将u.并发从5更改为2:
结果:CPU:将内存从26%减少到20%:使用率相同
修改:将u.并发从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
},
}
吉米,非常感谢。我不知道。我刚刚重新发送了这个文件,内存使用量大约是30MB,我知道这很好。S3不是有一个最大100MB的上传请求限制吗?