登录
首页 >  Golang >  Go问答

为什么从文件系统中下载比在内存中下载要快?

来源:stackoverflow

时间:2024-02-08 17:12:19 241浏览 收藏

有志者,事竟成!如果你在学习Golang,那么本文《为什么从文件系统中下载比在内存中下载要快?》,就很适合你!文章讲解的知识点主要包括,若是你对本文感兴趣,或者是想搞懂其中某个知识点,就请你继续往下看吧~

问题内容

我正在使用aws gosdk从某个存储桶下载。下面是下载的两种实现

  1. 下载到文件
func (a *awsclient) downloadtofile(ctx context.context, objectkey string) (string, error) {
    params := &awss3.getobjectinput{
        bucket: aws.string(a.bucket),
        key:    aws.string(objectkey),
    }

    downloadpath := "some/valid/path"
    f, err := os.create(downloadpath)
    defer f.close()
    _, err = a.downloader.download(ctx, f, params)
    return downloadpath, err
}
  1. 下载到内存
func (a *AwsClient) DownloadToMemory(ctx context.Context, objectKey string) (string, error) {
    params := &awsS3.GetObjectInput{
        Bucket: aws.String(a.bucket),
        Key:    aws.String(objectKey),
    }

    buffer := manager.NewWriteAtBuffer([]byte{})  
    _, err = a.downloader.Download(ctx, buffer, params)
    return buffer.Bytes(), err
}

对于 100 mb 的文件,下载到内存中需要 30 秒,下载到文件系统中只需要 8 秒。我的期望是内存下载应该快得多。我的系统(apple m1、ventura、8gb ram)有足够的可用 ram,所以这不是问题。有人可以帮助我理解这种行为吗?


正确答案


将大的 S3 对象下载到动态缓冲区中效率非常低。该缓冲区被重新分配多次以处理 100M 数据和多个下载线程。内存重新分配需要大量 CPU 时间。

尝试在开始时分配 100M,而不是使用空字节片。

如果对象大小未知,您可以使用 S3.HeadObject 实时获取对象长度。

到这里,我们也就讲完了《为什么从文件系统中下载比在内存中下载要快?》的内容了。个人认为,基础知识的学习和巩固,是为了更好的将其运用到项目中,欢迎关注golang学习网公众号,带你了解更多关于的知识点!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>