如何从Linux上当前运行的Python进程访问数据结构?

我有一个长期运行的Python进程,它产生的数据比我计划的要多。 我的结果存储在一个列表中,当程序完成后,它将被序列化(腌制)并写入磁盘 - 如果它达到那么远。 但是按照这个速度,这个列表很可能会耗尽所有1 GB以上的可用内存,并且这个过程会崩溃,在这个过程中失去了我所有的结果。

我计划修改我的脚本以定期将结果写入磁盘,但如果可能的话,我想保存当前正在运行的进程的结果。 有什么方法可以从正在运行的进程中获取内存中的数据结构并将其写入磁盘?

我发现了code.interact(),但由于我的代码中没有这个钩子,所以对我来说(对偷窥现在运行的Python程序的方法)没有用处。

我在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'

注意使用ulimit命令设置linux来创建coredumps。

ulimit -a会告诉你什么是当前的限制。

ulimit -c unlimited将启用任何大小的核心转储。


虽然当然不是很漂亮,但你可以尝试通过proc文件系统来访问你的进程的数据.. / proc / [pid-of-your-process]。 proc文件系统存储了大量的每个进程信息,例如当前打开的文件指针,内存映射等等。 通过一些挖掘,你可能能够访问你需要的数据。

仍然我怀疑你应该从python内部看这个,并做一些运行时记录和调试。


+1非常有趣的问题。

我不知道这可能对你有多好(特别是因为我不知道你是否会在程序中重复使用腌制列表),但我会建议这样做:当你写入磁盘时,将列表打印出来STDOUT。 当你运行python脚本时(我也是从命令行猜测的),重定向输出以附加到文件中,如下所示:

python myScript.py >> logFile. 

这应该将所有列表存储在logFile中。 这样,您可以随时查看logFile中的内容,并且您应该拥有最新的数据结构(取决于您打印的地方)。

希望这可以帮助

链接地址: http://www.djcxy.com/p/48239.html

上一篇: How to access a data structure from a currently running Python process on Linux?

下一篇: How to model a custom type in a relational database?