Как получить доступ к структуре данных из запущенного в настоящее время процесса Python в Linux? - PullRequest
8 голосов
/ 04 октября 2010

У меня есть длительный процесс Python, который генерирует больше данных, чем я планировал. Мои результаты хранятся в списке, который будет сериализован (зарезан) и записан на диск после завершения программы - если она зайдет так далеко. Но с такой скоростью, более вероятно, что список исчерпает все 1 ГБ свободной оперативной памяти, и процесс завершится сбоем, потеряв при этом все мои результаты.

Я планирую изменить свой сценарий, чтобы периодически записывать результаты на диск, но я хотел бы сохранить результаты текущего запущенного процесса, если это возможно. Есть ли способ, как я могу получить структуру данных в памяти из запущенного процесса и записать ее на диск?

Я нашел code.interact (), но так как в моем коде уже нет этой ловушки, он мне не кажется полезным ( Метод, чтобы заглянуть в программу Python, запущенную прямо сейчас ).

Я использую Python 2.5 на Fedora 8. Есть мысли?

Большое спасибо.

Шахин

Ответы [ 4 ]

3 голосов
/ 04 октября 2010

Вы мало что можете сделать для работающей программы. Единственное, о чем я могу думать, это подключить отладчик gdb, остановить процесс и проверить память. В качестве альтернативы убедитесь, что ваша система настроена на сохранение дампов ядра, а затем завершите процесс с помощью kill --sigsegv <pid>. После этого вы сможете открыть дамп ядра с помощью gdb и проверить его на досуге.

Существуют некоторые макросы GDB, которые позволят вам изучить структуры данных Python и выполнить код Python из GDB, но для их работы вам необходимо иметь скомпилированный Python с включенными символами отладки, и я сомневаюсь, что это ваш случай. Создание дампов ядра, а затем перекомпиляция python с символами НЕ будет работать, так как все адреса будут отличаться от значений в дампе.

Вот несколько ссылок для изучения Python из GDB:

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

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

или Google для 'Python GDB'

N.B. чтобы настроить linux для создания coredumps, используйте команду ulimit.

ulimit -a покажет вам, какие текущие ограничения установлены.

ulimit -c unlimited включит дамп памяти любого размера.

1 голос
/ 04 октября 2010

Хотя, конечно, не очень красиво, вы можете попытаться получить доступ к данным вашего процесса через файловую систему proc .. / proc / [pid-of-your-process]. В файловой системе proc хранится много информации о процессах, такой как открытые в данный момент файловые указатели, карты памяти и тому подобное. Немного покопавшись, вы сможете получить доступ к нужным вам данным.

Тем не менее, я подозреваю, что вам следует взглянуть на это изнутри python и выполнить некоторые записи и отладку во время выполнения.

0 голосов
/ 04 октября 2010

Этот ответ содержит информацию о присоединении gdb к процессу python с макросами, которые приведут вас к pdb сеансу в этом процессе.Я сам не пробовал, но получил 20 голосов.Звучит так, как будто вы в конечном итоге повесили приложение, но в вашем случае, похоже, стоит рискнуть.

0 голосов
/ 04 октября 2010

+ 1 Очень интересный вопрос.

Я не знаю, насколько хорошо это может сработать для вас (тем более, что я не знаю, будете ли вы повторно использовать маринованный список в программе), но я бы посоветовал это: при записи на дискраспечатайте список в STDOUT.Когда вы запускаете свой скрипт на Python (я полагаю также из командной строки), перенаправьте вывод, чтобы добавить в файл, например, так:

python myScript.py >> logFile. 

Это должно сохранить все списки в logFile.Таким образом, вы всегда можете взглянуть на то, что находится в logFile, и у вас должны быть самые современные структуры данных (в зависимости от того, где вы вызываете print).

Надеюсь, это поможет

...