首頁  >  文章  >  後端開發  >  為什麼在記憶體中下載比從 aws s3 在檔案系統中下載慢?

為什麼在記憶體中下載比從 aws s3 在檔案系統中下載慢?

王林
王林轉載
2024-02-09 11:57:29585瀏覽

为什么在内存中下载比从 aws s3 在文件系统中下载慢?

為什麼在記憶體中下載比從AWS S3在檔案系統中下載慢? 在下載檔案時,我們通常會選擇從AWS S3儲存桶下載到本機檔案系統。然而,有時候我們會發現,使用記憶體中的下載方式比直接從S3下載到檔案系統慢。這是因為在記憶體中下載涉及一些額外的步驟和資源消耗。首先,記憶體中的下載需要將檔案內容讀取到記憶體中,然後再寫入到檔案系統中。這個過程中涉及了額外的記憶體操作和IO操作,相較於直接從S3下載到檔案系統,會導致下載速度變慢。另外,記憶體中的下載還可能受到記憶體限制的影響,當下載的檔案較大時,可能會導致記憶體不足的問題,進而影響下載速度。因此,在選擇下載方式時,需要根據具體情況權衡利弊,選擇最適合的方式進行下載操作。

問題內容

我正在使用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 即時取得物件長度。

以上是為什麼在記憶體中下載比從 aws s3 在檔案系統中下載慢?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:stackoverflow.com。如有侵權,請聯絡admin@php.cn刪除