【问题标题】:How to use less memory when sending large files to Amazon S3 via Golang SDK?通过 Golang SDK 向 Amazon S3 发送大文件时如何使用更少的内存?
【发布时间】:2016-05-26 19:57:45
【问题描述】:

我在 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% 内存:使用相同

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

我想调整它以尽可能减少资源。我该如何处理?

【问题讨论】:

    标签: amazon-web-services memory go amazon-s3


    【解决方案1】:

    没有理由将整个文件读入内存。只需提供文件本身的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
        },
    }
    

    【讨论】:

    • JimB,非常感谢。我不知道。我刚刚重新发送了文件,内存使用量约为 30MB,知道它非常好。
    • S3不是有一个上传请求最大100MB的限制吗?
    猜你喜欢
    • 1970-01-01
    • 2018-12-09
    • 2012-08-30
    • 1970-01-01
    • 2016-08-15
    • 2020-06-16
    • 1970-01-01
    • 2023-03-19
    • 1970-01-01
    相关资源
    最近更新 更多