Heim  >  Artikel  >  Backend-Entwicklung  >  Warum ist das Herunterladen im Speicher langsamer als das Herunterladen im Dateisystem von aws s3?

Warum ist das Herunterladen im Speicher langsamer als das Herunterladen im Dateisystem von aws s3?

王林
王林nach vorne
2024-02-09 11:57:29585Durchsuche

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

Warum ist das Herunterladen im Speicher langsamer als das Herunterladen im Dateisystem von AWS S3? Beim Herunterladen von Dateien entscheiden wir uns normalerweise für den Download aus einem AWS S3-Bucket in das lokale Dateisystem. Manchmal stellen wir jedoch fest, dass die Verwendung der In-Memory-Download-Methode langsamer ist als der direkte Download von S3 in das Dateisystem. Dies liegt daran, dass das Herunterladen in den Speicher einige zusätzliche Schritte und einen Ressourcenverbrauch erfordert. Bei In-Memory-Downloads ist zunächst das Einlesen des Dateiinhalts in den Speicher und das anschließende Schreiben in das Dateisystem erforderlich. Dieser Vorgang erfordert zusätzliche Speichervorgänge und E/A-Vorgänge, wodurch die Download-Geschwindigkeit langsamer ist als beim direkten Herunterladen von S3 in das Dateisystem. Darüber hinaus können In-Memory-Downloads auch von Speicherbeschränkungen betroffen sein. Wenn die heruntergeladenen Dateien groß sind, kann es zu Problemen mit unzureichendem Speicher kommen, wodurch die Download-Geschwindigkeit beeinträchtigt wird. Daher müssen Sie bei der Auswahl einer Download-Methode die Vor- und Nachteile je nach Situation abwägen und die am besten geeignete Download-Methode auswählen.

Frageninhalt

Ich verwende aws gosdk, um aus einem bestimmten Bucket herunterzuladen. Nachfolgend finden Sie zwei Implementierungen zum Download

  1. In Datei herunterladen
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. In den internen Speicher herunterladen
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
}

Bei einer 100-MB-Datei dauert das Herunterladen in den Speicher 30 Sekunden und das Herunterladen in das Dateisystem nur 8 Sekunden. Ich gehe davon aus, dass Speicher-Downloads viel schneller erfolgen sollten. Auf meinem System (Apple M1, Ventura, 8 GB RAM) ist genügend RAM verfügbar, sodass dies kein Problem darstellt. Kann mir jemand helfen, dieses Verhalten zu verstehen?

Workaround

Das Herunterladen großer S3-Objekte in dynamische Puffer ist sehr ineffizient. Der Puffer wurde mehrmals neu zugewiesen, um 100 MB Daten und mehrere Download-Threads zu verarbeiten. Die Neuzuweisung von Speicher erfordert erhebliche CPU-Zeit.

Versuchen Sie, zu Beginn 100 MB zuzuweisen, anstatt Null-Byte-Slices zu verwenden.

Wenn die Objektgröße unbekannt ist, können Sie S3.HeadObject verwenden, um die Objektlänge in Echtzeit zu ermitteln.

Das obige ist der detaillierte Inhalt vonWarum ist das Herunterladen im Speicher langsamer als das Herunterladen im Dateisystem von aws s3?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:stackoverflow.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen