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