GAE a diverses limitations, dont l'une est la taille du plus grand bloc allouable de mémoire s'élevant à 1 Mo (maintenant 10 fois plus, mais cela ne change pas la question). La limitation signifie que l'on ne peut mettre plus d'un certain nombre d'éléments dans list() car CPython essayera d'allouer un bloc mémoire contigu pour les pointeurs d'éléments. Avoir d'énormes listes() peut être considéré comme une mauvaise pratique de programmation, mais même si aucune structure énorme n'est créée dans le programme lui-même, CPython en conserve quelques-unes dans les coulisses.Structures internes de CPython
Il semble que CPython maintient une liste globale unique d'objets ou quelque chose. C'est à dire. application qui a beaucoup de petits objets ont tendance à allouer de plus en plus gros blocs de mémoire.
La première idée était gc, et la désactiver change un peu le comportement de l'application mais certaines structures sont maintenues.
Une application courte simple que l'expérience de la question est:
a = b = []
number_of_lists = 8000000
for i in xrange(number_of_lists):
b.append([])
b = b[0]
Quelqu'un peut-il me éclairer comment empêcher CPython d'allouer d'énormes structures internes en ayant beaucoup d'objets dans l'application?
Quelle est la question ** réelle **. Pourquoi l'épuisement de la mémoire importe-t-il? Quel problème particulier avez-vous qui semble exiger des blocs de mémoire géants? Vous pouvez probablement résoudre ce problème pour ne pas allouer de la mémoire en premier lieu. Quel est le problème ** réel ** que vous essayez de résoudre? –