Amazon web services 如何在通过Golang SDK向Amazon 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

我在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)
}
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的上传请求限制吗?