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.
J'utilise AWS Gosdk pour télécharger à partir d'un certain compartiment. Vous trouverez ci-dessous deux implémentations à télécharger
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 }
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 ?
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!