2010-10-04 7 views
7

J'ai un processus Python à long terme qui génère plus de données que prévu. Mes résultats sont stockés dans une liste qui sera sérialisée (décapée) et écrite sur le disque à la fin du programme - si cela arrive aussi loin. Mais à ce rythme, il est plus probable que la liste épuisera toutes les RAM de plus de 1 Go et que le processus se bloque, perdant tous mes résultats dans le processus.Comment accéder à une structure de données à partir d'un processus Python sous Linux?

Je prévois de modifier mon script pour écrire des résultats sur le disque périodiquement, mais je voudrais enregistrer les résultats du processus en cours si possible. Est-il possible de récupérer une structure de données en mémoire à partir d'un processus en cours et de l'écrire sur le disque?

J'ai trouvé code.interact(), mais comme je n'ai pas déjà ce hook dans mon code, ça ne me semble pas utile (Method to peek at a Python program running right now). Je cours Python 2.5 sur Fedora 8. Des pensées?

Merci beaucoup.

Shahin

+0

Si vous l'enregistrez et que vous le rechargez, ne seriez-vous pas aussi démuni que vous le deviez? –

+1

Dans ce cas particulier, je vais le transférer sur une autre machine (avec plus de mémoire) pour le désérialiser et soit le réécrire au coup par coup ou le charger directement dans une base de données. De toute évidence pas durable, mais je ne cherche qu'une solution temporaire. – Shahin

Répondre

3

Il n'y a pas grand-chose que vous pouvez faire pour un programme en cours d'exécution. La seule chose à laquelle je peux penser est d'attacher le débogueur gdb, d'arrêter le processus et d'examiner la mémoire. Sinon, assurez-vous que votre système est configuré pour enregistrer les vidages de mémoire, puis tuez le processus avec kill --sigsegv <pid>. Vous devriez alors être en mesure d'ouvrir la sauvegarde du noyau avec gdb et l'examiner à votre guise. Il existe quelques macros gdb qui vous permettront d'examiner les structures de données python et d'exécuter du code python depuis gdb, mais pour que cela fonctionne, vous devez avoir compilé python avec les symboles de débogage activés et je doute que ce soit votre cas. La création d'un core dump d'abord puis la recompilation de python avec des symboles ne fonctionneront PAS, puisque toutes les adresses auront changé depuis les valeurs de la sauvegarde.

Voici quelques liens pour python de gdb introspectant:

http://wiki.python.org/moin/DebuggingWithGdb

http://chrismiles.livejournal.com/20226.html

ou google pour 'gdb python'

N.B. pour définir linux pour créer des coredumps, utilisez la commande ulimit.

ulimit -a va vous montrer à quoi les limites actuelles sont fixées.

ulimit -c unlimited activera les vidages de mémoire de toute taille.

+0

Dommage. Cela semble utile plus généralement, je vais donc essayer. Merci pour la réponse détaillée. – Shahin

0

+1 Question très intéressante. Je ne sais pas si cela peut fonctionner pour vous (surtout que je ne sais pas si vous réutiliserez la liste décapée dans le programme), mais je suggérerais ceci: lorsque vous écrivez sur le disque, imprimez sur la liste à STDOUT. Lorsque vous exécutez votre script python (je devine aussi de la ligne de commande), rediriger la sortie à ajouter à un fichier comme ceci:

python myScript.py >> logFile. 

Cela devrait stocker toutes les listes dans le fichier journal. De cette façon, vous pouvez toujours regarder ce qui se trouve dans logFile et vous devriez avoir les structures de données les plus à jour (selon l'endroit où vous appelez print).

Hope this helps

1

Bien que certainement pas très jolie, vous pouvez essayer d'accéder aux données de votre processus via le système de fichiers proc ../proc/[pid-of-your-process]. Le système de fichiers proc stocke beaucoup d'informations par processus telles que les pointeurs de fichiers ouverts actuellement, les cartes mémoire et autres. Avec un peu de creusement, vous pourrez peut-être accéder aux données dont vous avez besoin.

Encore je suspecte que vous devriez plutôt regarder ceci à partir de python et faire un certain temps d'exécution de notation & de débogage.

0

This answer contient des informations sur l'association de gdb à un processus python, avec des macros qui vous mèneront à une session pdb dans ce processus. Je ne l'ai pas essayé moi-même mais il a obtenu 20 votes. On dirait que vous pourriez finir par accrocher l'application, mais semble également valoir le risque dans votre cas. Qu'espérez-vous faire avec la «structure de données du processus en cours»?

Questions connexes