Comprendre l'itération efficace en mémoire dans SqlAlchemy
Lors de la gestion de grands ensembles de données dans MySQL à l'aide de SqlAlchemy, la consommation de mémoire peut devenir un problème. La syntaxe du générateur intégré, telle que la suivante, peut ne pas être aussi efficace en mémoire que prévu :
for thing in session.query(Things): analyze(thing)
Consommation de mémoire sous-jacente
La plupart des lignes de tampon des implémentations DBAPI au fur et à mesure qu'ils sont récupérés. Cela signifie qu'avant même que SqlAlchemy ne récupère le premier résultat, l'intégralité du jeu de résultats peut être en mémoire.
Comportement par défaut de la requête
L'objet Query de SqlAlchemy charge généralement l'intégralité du jeu de résultats. en mémoire avant de renvoyer les objets. Cela est dû aux requêtes qui impliquent des instructions SELECT non triviales. Cependant, Query propose une option "yield_per()" pour modifier ce comportement.
yield_per()
L'option "yield_per()" permet à Query de générer des lignes dans lots d'une taille spécifiée. Cela peut améliorer l’utilisation de la mémoire, mais requiert de la prudence. Cela n'est approprié que si vous n'effectuez pas de chargement hâtif de collections. De plus, si la DBAPI pré-tamponne les lignes, les économies de mémoire peuvent être limitées.
Approche de la fonction de fenêtre
Une alternative à "yield_per()" consiste à utiliser une fenêtre approche fonctionnelle. Cela implique de pré-récupérer les valeurs de « fenêtre » qui font référence à des morceaux de la table et d'émettre des instructions SELECT individuelles qui extraient de ces fenêtres une par une. Cette approche permet d'éviter la dégradation des performances de "LIMIT" et "OFFSET" pour les décalages importants.
Conclusion
Bien que les générateurs intégrés de SqlAlchemy puissent être pratiques, ils peuvent ne fournissent pas toujours une efficacité de mémoire optimale. Comprendre la consommation de mémoire sous-jacente et utiliser des approches alternatives telles que "yield_per()" ou des fonctions de fenêtre peuvent aider à atténuer les problèmes de mémoire lorsque vous travaillez avec de grands ensembles de données.
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!