Maison > développement back-end > Golang > Pourquoi le téléchargement en mémoire est-il plus lent que le téléchargement dans le système de fichiers à partir d'AWS S3 ?

Pourquoi le téléchargement en mémoire est-il plus lent que le téléchargement dans le système de fichiers à partir d'AWS S3 ?

王林
Libérer: 2024-02-09 11:57:29
avant
630 Les gens l'ont consulté

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

Pourquoi le téléchargement en mémoire est-il plus lent que le téléchargement dans le système de fichiers depuis AWS S3 ? Lors du téléchargement de fichiers, nous choisissons généralement de télécharger depuis un compartiment AWS S3 vers le système de fichiers local. Cependant, nous constatons parfois que l'utilisation de la méthode de téléchargement en mémoire est plus lente que le téléchargement direct depuis S3 vers le système de fichiers. En effet, le téléchargement en mémoire implique des étapes supplémentaires et une consommation de ressources. Premièrement, les téléchargements en mémoire nécessitent de lire le contenu du fichier en mémoire, puis de l'écrire dans le système de fichiers. Ce processus implique des opérations de mémoire supplémentaires et des opérations d'E/S, ce qui ralentira la vitesse de téléchargement par rapport au téléchargement direct de S3 vers le système de fichiers. De plus, les téléchargements en mémoire peuvent également être affectés par des limitations de mémoire. Lorsque les fichiers téléchargés sont volumineux, cela peut entraîner des problèmes de mémoire insuffisante, affectant ainsi la vitesse de téléchargement. Par conséquent, lors du choix d'une méthode de téléchargement, vous devez peser le pour et le contre en fonction de la situation spécifique et choisir la méthode de téléchargement la plus appropriée.

Contenu de la question

J'utilise AWS Gosdk pour télécharger à partir d'un certain compartiment. Vous trouverez ci-dessous deux implémentations à télécharger

  1. Télécharger dans un fichier
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
}
Copier après la connexion
  • Télécharger sur la mémoire interne
  • 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
    }
    Copier après la connexion

    Pour un fichier de 100 Mo, le téléchargement dans la mémoire prend 30 secondes et seulement 8 secondes pour le téléchargement dans le système de fichiers. Je m'attends à ce que les téléchargements de mémoire soient beaucoup plus rapides. Mon système (apple m1, ventura, 8 Go de RAM) dispose de suffisamment de RAM disponible, ce n'est donc pas un problème. Quelqu'un peut-il m'aider à comprendre ce comportement ?

    Solution de contournement

    Le téléchargement d'objets S3 volumineux dans des tampons dynamiques est très inefficace. Le tampon a été réaffecté plusieurs fois pour gérer 100 M de données et plusieurs threads de téléchargement. La réallocation de mémoire nécessite un temps CPU important.

    Essayez d'allouer 100 Mo au début au lieu d'utiliser des tranches d'octets nuls.

    Si la taille de l'objet est inconnue, vous pouvez utiliser S3.HeadObject pour obtenir la longueur de l'objet en temps réel.

    Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

    Étiquettes associées:
    source:stackoverflow.com
    Déclaration de ce site Web
    Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
    Tutoriels populaires
    Plus>
    Derniers téléchargements
    Plus>
    effets Web
    Code source du site Web
    Matériel du site Web
    Modèle frontal