2017-07-31 2 views
0

Je viens de voir un MemoryError arriver sur une machine et je remarquai le cache disponible sur le serveur considérablement augmenté après. Existe-t-il un moyen par lequel Python déclenche une tâche de gestion de la mémoire lorsque l'erreur est levée? Ou est-ce potentiellement géré par le serveur (Linux/CentOs)?Est-ce que MemoryError fait que python vide son cache?

Répondre

1

MemoryError ne sont pas traitées spécialement d'une manière qui devrait faire que cela se produise pour elle, et aucune autre exception, mais:

  1. Des exceptions détendre la pile, et les objets référencés uniquement le long de la pile entre la exception étant levée et quand elle est attrapée sera généralement libérée lorsque la gestion des exceptions est terminée (pendant la gestion, la trace d'exception tend à créer des références cycliques qui empêchent le nettoyage)
  2. MemoryError hérite de BaseException, et non Exception, donc c'est moins susceptible d'être manipulé par "générique" except Exception: blocs, ce qui signifie plus de couches de pile sont déroulées et finalement libéré
  3. Le CPython garbage collector cyclique determines when to run collections based on the number of allocations and deallocations that have occurred; si le grand dérouleur de pile libère un grand nombre d'objets, encore plus pourrait être libéré s'il suffit de déclencher une collection

Tout cela augmente les chances que la mémoire sera libéré, mais aucun d'entre elle est spécifique à MemoryError; le même comportement pourrait être observé si vous frappez Ctrl-C et déclenché un KeyboardInterrupt. Plus probablement, vous voyez l'exit Python, ou Linux répond à la demande de mémoire extrême en vidant son cache; le MemoryError viendrait après le cache est vidé pour tenter de satisfaire la grande demande de mémoire, en particulier si la demande est faite dans plusieurs demandes successives pour des blocs de mémoire au lieu d'une demande énorme unique.

+0

Explication fantastique, merci beaucoup! – JacobIRR