[英]How to access a data structure from a currently running Python process on Linux?
我有一個長期運行的Python進程,它生成的數據超出了我的計划。 我的結果存儲在一個列表中,該列表將在程序完成時進行序列化(腌制)並寫入磁盤(如果可以的話)。 但是以這種速度,列表更有可能耗盡所有1GB以上的可用RAM,並且該過程將崩潰,從而丟失該過程中的所有結果。
我計划修改腳本以定期將結果寫入磁盤,但是如果可能的話,我想保存當前正在運行的過程的結果。 有什么方法可以從正在運行的進程中獲取內存中的數據結構並將其寫入磁盤?
我找到了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
或Google搜索“ python gdb”
注意,使用ulimit命令將linux設置為創建coredumps。
ulimit -a
將向您顯示當前限制設置。
ulimit -c unlimited
將啟用任何大小的核心轉儲。
雖然當然不是很漂亮,但是您可以嘗試通過proc文件系統訪問過程的數據。/ proc / [您的進程的pid]。 proc文件系統存儲許多每個進程的信息,例如當前打開的文件指針,內存映射以及不存儲的信息。 經過一點挖掘,您也許可以訪問所需的數據。
仍然我懷疑您應該寧願從python內部查看它並進行一些運行時日志記錄和調試。
+1非常有趣的問題。
我不知道這對您有多好(特別是因為我不知道您是否會重用程序中的腌制列表),但是我建議這樣做:在您寫入磁盤時,將列表打印出來標准輸出。 當您運行python腳本時(我也在命令行中猜測),將輸出重定向到如下文件:
python myScript.py >> logFile.
這應將所有列表存儲在logFile中。 這樣,您可以始終查看logFile中的內容,並且其中應該具有最新的數據結構(取決於調用print的位置)。
希望這可以幫助
此答案包含有關將gdb
附加到python進程的信息,其宏將使您進入該進程的pdb
會話。 我自己沒有嘗試過,但獲得20票。 聽起來您可能最終會掛起該應用程序,但在您的情況下似乎值得冒險。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.