Veuillez consulter le réponse suivante par @joeblog pour la meilleure solution.
Tout d'abord, vous ne devriez pas avoir besoin de toute cette RAM en premier lieu. Ce que vous devriez faire ici est de récupérer morceaux de l'ensemble des résultats. Ne faites pas de fetchall()
. Au lieu de cela, utilisez la méthode beaucoup plus efficace cursor.fetchmany
méthode. Voir la documentation de psycopg2 .
Maintenant, l'explication de pourquoi il n'est pas libéré, et pourquoi ce n'est pas une fuite de mémoire dans l'utilisation formellement correcte de ce terme.
La plupart des processus ne restituent pas la mémoire au système d'exploitation lorsqu'elle est libérée, ils la rendent disponible pour une réutilisation ailleurs dans le programme.
La mémoire ne peut être libérée pour le système d'exploitation que si le programme peut compacter les objets restants dispersés dans la mémoire. Ceci n'est possible que si des références indirectes sont utilisées, car sinon le déplacement d'un objet invaliderait les pointeurs existants vers cet objet. Les références indirectes sont plutôt inefficaces, en particulier sur les processeurs modernes où le fait de courir après les pointeurs a des effets néfastes sur les performances.
Ce qui se passe généralement, à moins que le programme ne fasse preuve d'une grande prudence, c'est que chaque gros morceau de mémoire alloué avec l'option brk()
se retrouve avec quelques petites pièces encore utilisées.
Le système d'exploitation ne peut pas dire si le programme considère que cette mémoire est toujours utilisée ou non, il ne peut donc pas la réclamer. Comme le programme n'a pas tendance à accéder à la mémoire, le système d'exploitation la libère généralement au fil du temps, libérant ainsi la mémoire physique pour d'autres utilisations. C'est l'une des raisons pour lesquelles vous devez disposer d'un espace d'échange.
Il est possible d'écrire des programmes qui rendent la mémoire au système d'exploitation, mais je ne suis pas sûr qu'on puisse le faire avec Python.
Voir aussi :
Donc : ce n'est pas vraiment un souvenir fuite . Si vous faites autre chose qui utilise beaucoup de mémoire, le processus ne devrait pas grandir beaucoup, voire pas du tout, il réutilisera la mémoire précédemment libérée lors de la dernière grosse allocation.