Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Mengapa memuat turun dalam memori lebih perlahan daripada memuat turun dalam sistem fail daripada aws s3?

Mengapa memuat turun dalam memori lebih perlahan daripada memuat turun dalam sistem fail daripada aws s3?

王林
王林ke hadapan
2024-02-09 11:57:29585semak imbas

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

Mengapa memuat turun dalam memori lebih perlahan daripada memuat turun dalam sistem fail daripada AWS S3? Apabila memuat turun fail, kami biasanya memilih untuk memuat turun daripada baldi AWS S3 ke sistem fail tempatan. Walau bagaimanapun, kadangkala kami mendapati bahawa menggunakan kaedah muat turun dalam memori adalah lebih perlahan daripada memuat turun terus dari S3 ke sistem fail. Ini kerana memuat turun dalam ingatan melibatkan beberapa langkah tambahan dan penggunaan sumber. Mula-mula, muat turun dalam memori memerlukan membaca kandungan fail ke dalam memori dan kemudian menulisnya ke sistem fail. Proses ini melibatkan operasi memori tambahan dan operasi IO, yang akan menyebabkan kelajuan muat turun menjadi lebih perlahan daripada memuat turun terus dari S3 ke sistem fail. Selain itu, muat turun dalam memori juga mungkin dipengaruhi oleh had memori Apabila fail yang dimuat turun adalah besar, ia mungkin menyebabkan masalah ingatan yang tidak mencukupi, sekali gus menjejaskan kelajuan muat turun. Oleh itu, apabila memilih kaedah muat turun, anda perlu menimbang kebaikan dan keburukan mengikut situasi tertentu dan memilih kaedah yang paling sesuai untuk memuat turun.

Kandungan soalan

Saya menggunakan aws gosdk untuk memuat turun daripada baldi tertentu. Di bawah ialah dua pelaksanaan untuk dimuat turun

  1. Muat turun ke fail
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. Muat turun ke memori dalaman
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
}

Untuk fail 100 mb, ia mengambil masa 30 saat untuk memuat turun ke memori dan hanya 8 saat untuk memuat turun ke sistem fail. Jangkaan saya ialah muat turun memori sepatutnya lebih pantas. Sistem saya (epal m1, ventura, ram 8gb) mempunyai ram yang mencukupi, jadi ini bukan masalah. Bolehkah sesiapa membantu saya memahami tingkah laku ini?

Penyelesaian

Memuat turun objek S3 yang besar ke dalam penimbal dinamik adalah sangat tidak cekap. Penampan telah diperuntukkan semula beberapa kali untuk mengendalikan 100M data dan berbilang urutan muat turun. Pengagihan semula memori memerlukan masa CPU yang ketara.

Cuba peruntukkan 100M pada permulaan dan bukannya menggunakan kepingan bait nol.

Jika saiz objek tidak diketahui, anda boleh menggunakan S3.HeadObject untuk mendapatkan panjang objek dalam masa nyata.

Atas ialah kandungan terperinci Mengapa memuat turun dalam memori lebih perlahan daripada memuat turun dalam sistem fail daripada aws s3?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:stackoverflow.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam