我有一个长期运行的Python进程,它生成的数据比我计划的要多。我的结果存储在一个列表中,该列表将在程序完成时被序列化(pickle)并写入磁盘 - 如果它到达那么远。但是按照这个速度,列表更有可能耗尽所有1 GB以上的可用RAM,并且该过程将崩溃,从而在此过程中丢失所有结果。
我计划修改我的脚本以定期将结果写入磁盘,但是如果可能的话,我想保存当前正在运行的进程的结果。有没有什么方法可以从正在运行的进程中获取内存中的数据结构并将其写入磁盘?
我找到了code.interact(),但由于我的代码中没有这个钩子,所以它对我来说似乎没用(Method to peek at a Python program running right now)。
我在Fedora 8上运行Python 2.5。有什么想法吗?
非常感谢。
Shahin的
答案 0 :(得分:3)
您无法为正在运行的程序执行任何操作。我唯一能想到的是附加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'
N.B。设置linux以创建coredumps使用ulimit命令。
ulimit -a
会显示当前限制的设置。
ulimit -c unlimited
将启用任意大小的核心转储。
答案 1 :(得分:1)
虽然肯定不是很漂亮,但你可以尝试通过proc文件系统访问你的进程数据.. / proc / [你的进程的pid]。 proc文件系统存储了很多每个进程信息,例如当前打开的文件指针,内存映射等等。通过一些挖掘,您可以访问所需的数据。
我仍然怀疑你应该从python中查看这个并做一些运行时记录和调试。
答案 2 :(得分:0)
+1非常有趣的问题。
我不知道这对你有多好(特别是因为我不知道你是否会重复使用程序中的pickle列表),但我建议这样做:当你写入磁盘时,打印出来STDOUT列表。当你运行你的python脚本时(我也是从命令行猜测),重定向输出以追加到这样的文件:
python myScript.py >> logFile.
这应该存储logFile中的所有列表。 这样,您可以随时查看logFile中的内容,并且您应该拥有最新的数据结构(取决于您调用print的位置)。
希望这有帮助
答案 3 :(得分:0)
This answer有关于将gdb
附加到python进程的信息,其中的宏将使您进入该进程中的pdb
会话。我自己没试过,但得到了20票。听起来你最终会挂起应用程序,但在你的情况下似乎也值得冒风险。