2010-10-04 3 views
7

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

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

Я нашел код.interact(), но поскольку у меня нет этого крючка в моем коде уже, мне это не кажется полезным (Method to peek at a Python program running right now).

Я запускаю Python 2.5 на Fedora 8. Любые мысли?

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

Shahin

+0

Что вы надеетесь сделать с «структурой данных текущего процесса»? Если вы сохраните его и загрузите обратно, не будете ли вы так же отстать от памяти, как вы должны начать? –

+1

В этом конкретном случае я переношу его на другую машину (с большим объемом памяти), чтобы десериализовать ее и либо записать ее обратно по частям, либо загрузить ее непосредственно в базу данных. Очевидно, что это не устойчиво, но я ищу одноразовое решение. – Shahin

ответ

3

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

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

Вот некоторые ссылки для интроспекции питона из БГД:

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

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

или Google для 'питона БГД'

нотабене для установки linux для создания командной строки используйте команду ulimit.

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

ulimit -c unlimited включит основные свалки любого размера.

+0

Слишком плохо. Это звучит, в общем, полезно, поэтому я дам ему шанс. Спасибо за подробный ответ. – Shahin

0

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

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

python myScript.py >> logFile. 

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

Надеется, что это помогает

1

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

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

0

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