我有一个长期运行的
Python进程,它生成的数据超出了我的计划.我的结果存储在一个列表中,该列表将被序列化(pickle)并在程序完成时写入磁盘 – 如果它到达那么远.但是按照这个速度,该列表更有可能耗尽所有1 GB的可用RAM,并且该进程将崩溃,从而在此过程中丢失所有结果.
我计划修改我的脚本以定期将结果写入磁盘,但是如果可能的话,我想保存当前正在运行的进程的结果.有没有什么方法可以从正在运行的进程中获取内存中的数据结构并将其写入磁盘?
我找到了code.interact(),但由于我的代码中没有这个钩子,所以它对我来说似乎没用(Method to peek at a Python program running right now).
我在Fedora 8上运行Python 2.5.有什么想法吗?
非常感谢.
沙欣
解决方法
对于正在运行的程序,您无能为力.我唯一能想到的是附加gdb调试器,停止进程并检查内存.或者,确保您的系统已设置为保存核心转储,然后使用kill –sigsegv< pid>终止该进程.然后,您应该能够使用gdb打开核心转储并在闲暇时进行检查.
有一些gdb宏可以让你检查python数据结构并从gdb中执行python代码,但为了使这些工作你需要编译python启用调试符号,我怀疑你的情况.首先创建核心转储,然后使用符号重新编译python将不起作用,因为所有地址都将从转储中的值更改.
以下是从gdb内省python的一些链接:
http://wiki.python.org/moin/DebuggingWithGdb
http://chrismiles.livejournal.com/20226.html
或谷歌’python gdb’
注:要设置linux以创建coredump,请使用ulimit命令.
ulimit -a将显示当前限制的设置.
ulimit -c unlimited将启用任何大小的核心转储.