Как получить доступ к структуре данных из текущего процесса Python в Linux?

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

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

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

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

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

Шахин

4 Solutions collect form web for “Как получить доступ к структуре данных из текущего процесса Python в Linux?”

Существует мало что можно сделать для запуска программы. Единственное, что я могу придумать, – это подключить отладчик 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'

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

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

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

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

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

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

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

 python myScript.py >> logFile. 

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

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

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

  • Оптимизация наихудшего случая Сложность времени для O (1) для python dicts
  • Создание символической ссылки внутри zipfile в памяти с помощью python
  • cProfile занимает много памяти
  • Управление использованием памяти podbc
  • Очистить память, выделенную построением в IPython
  • Что делает «del» в точности?
  • Keras использует слишком много памяти GPU при вызове train_on_batch, fit и т. Д.
  • Python subprocess.Popen "OSError: Невозможно выделить память"
  • Как можно правильно управлять жизненными циклами объектов C ++ в Cython?
  • Почему elementtree.ElementTree.iterparse использует так много памяти?
  • Ошибка памяти при установке данных с использованием пакета sklearn
  • Python - лучший язык программирования в мире.