Python sur Ubuntu: comment détecter les exceptions de mémoire?

J’ai le bloc suivant dans mon script python qui s’exécute sur une instance Ubuntu AWS EC2:

try: data = json.loads(line) # further processing of data except Exception, e: # something went bad 

line est une chaîne issue d’un fichier texte. Dans la plupart des cas, il est traité correctement. De temps en temps, je reçois des lignes énormes. Dans ce cas, le script meurt (“-9”) et dmesg -T affiche un message similaire à [Tue Jan 8 16:10:48 2013] Out of memory: Kill process 13609 (python) score 910 or sacrifice child

Ce que je ne comprends pas, c’est pourquoi au lieu de planter, il ne détecte aucune exception dans le bloc try-except . Et est-il possible de faire des changements dans ce bloc pour que le script ne plante pas mais soulève des exceptions? THX

Votre processus Python est en train d’être tué par le killer (hors mémoire) du kernel ( docs ). Cela tue Python avec SIGKILL , donc Python n’a aucune chance de répondre à cet événement … il n’est donc pas capable de générer des exceptions pour votre code.

Vous devrez peut-être exécuter votre processus dans un environnement avec plus de ressources (afin de ne pas utiliser un pourcentage aussi élevé de mémoire système), ou vous devrez peut-être limiter la taille des données JSON que vous pourrez lire.

Un des liens que j’ai posté ci-dessous mentionne ijson , qui est un parsingur JSON itératif. Cela pourrait être plus efficace en termes de mémoire que les parsingurs JSON standard, mais je ne l’ai pas essayé.