2010-06-22 5 views
7

Ma mémoire de processus de code Python augmente dynamiquement car elle stocke les données dynamiques dans la liste, le dictionnaire et les tuples lorsque cela est nécessaire. Bien que toutes ces données dynamiques soient effacées physiquement dans leurs variables après, la mémoire ne tire pas vers le bas.Augmenter la mémoire du processus python au fil du temps

Par conséquent, je me suis senti comme s'il y avait une fuite de mémoire et j'ai utilisé la méthode gc.collect() pour collecter toute la mémoire non gérée. Mais je ne pouvais pas rendre la mémoire au minimum quand il n'y a pas de données dans les variables.

+0

Pourquoi voudriez-vous qu'il baisse? Quel système d'exploitation utilisez-vous? Dans de nombreux systèmes d'exploitation, une fois qu'un processus a acquis de la mémoire, le processus reste très important. –

+0

J'utilise Mac OS X 10.5, je crois que plus tard, il mangerait plus d'espace. actuellement, il avait augmenté d'environ 15 Mo plus de 24 Mo au stade initial. Je crois que la mémoire de processus devrait croître en termes de MB, ce qui pourrait affecter la taille de la mémoire disponible. – herby

Répondre

6

Il est très difficile, en général, un processus de « donner la mémoire de retour à l'OS » (jusqu'à ce que le processus se termine et le système d'exploitation récupère tous la mémoire, bien sûr) parce que (dans la plupart la mise en œuvre) ce malloc retours est découpé en gros blocs pour plus d'efficacité, mais le bloc entier ne peut pas être rendu si une partie de celui-ci est toujours utilisée - ainsi, la plupart des bibliothèques standard C n'essaient même pas.

Pour une discussion décente dans un contexte Python, voir par ex. here. Evan Jones a corrigé quelques problèmes spécifiques à Python comme décrit here et here, mais son correctif est dans le tronc depuis Python 2.5, donc les problèmes que vous observez sont définitivement avec le paquet système malloc, pas avec Python en soi. Une explication spécifique à 2.6 est here et here.

Un fil SO est here, où Hugh Allen dans sa réponse cite les programmeurs de Firefox à l'extension que Mac OS X est un système où il est fondamentalement impossible un processus pour donner la mémoire de retour à l'OS. Donc, seulement en terminant un processus, vous pouvez être sûr de libérer sa mémoire. Par exemple, un serveur de longue durée, de temps en temps, pourrait claquer son état sur le disque et s'éteindre (avec un petit processus de surveillance, un système ou une coutume, en le surveillant et en le redémarrant). Si vous savez que l'opération suivante nécessitera beaucoup de mémoire pendant une courte période, vous pouvez souvent exécuter le travail gourmand en mémoire dans le processus enfant et renvoyer les résultats (le cas échéant) au processus parent via un canal. le processus enfant se termine. Et ainsi de suite.

0

De quelle taille parlons-nous? Python lui-même prend une certaine quantité de mémoire .. jusqu'à peut-être 30 ou 40 Mo je crois. Si elle est plus grande que cela et ne pas être recueillie, vous avez une fuite de mémoire. Seules les ordures sans références peuvent être collectées, d'une certaine manière vos trucs supplémentaires sont toujours référencés. Faites un profil de mémoire et voyez ce qui se passe.

+0

actuellement, il avait augmenté d'environ 15 Mo plus de 24 Mo à l'étape initiale pour un scénario minimal. Cependant j'ai essayé l'outil de lien ci-dessous à partir duquel j'ai trouvé que les données visées ne sont pas plus de 3MB. Je n'ai pas pu obtenir le montant restant de détails de la mémoire. – herby

+0

Ce n'est pas énorme. Si vous recherchez un programme de mémoire super faible, vous ne codez normalement pas en Python. La plupart des PC ont 2-4GB de ram, 15MB ne vaut pas la peine de s'inquiéter. – bwawok

Questions connexes