2010-10-04 24 views
7

我有一個長期運行的Python進程,它產生的數據比我計劃的要多。我的結果存儲在一個列表中,當程序完成後,它將被序列化(醃製)並寫入磁盤 - 如果它達到那麼遠。但是按照這個速度,這個列表很可能會耗盡所有1 GB以上的可用內存,並且這個過程會崩潰,在這個過程中失去了我所有的結果。如何從Linux上當前運行的Python進程訪問數據結構?

我打算修改我的腳本以便定期將結果寫入磁盤,但是如果可能的話,我想保存當前正在運行的進程的結果。有什麼方法可以從正在運行的進程中獲取內存中的數據結構並將其寫入磁盤?

我發現code.interact(),但由於我的代碼中沒有這個鉤子,所以對我來說似乎沒有用(Method to peek at a Python program running right now)。

我在Fedora 8上運行Python 2.5。有什麼想法?

非常感謝。

Shahin

+0

你希望用'當前進程的數據結構'來做什麼?如果你把它保存下來並重新加載,你會不會像你一開始那樣內存不足? – 2010-10-04 04:41:16

+1

在這種特殊情況下,我會將它轉移到另一臺機器(具有更多內存)以反序列化它,並將其寫回零碎或將其直接加載到數據庫中。顯然不可持續,但我只在這裏尋找一次性臨時解決方案。 – Shahin 2010-10-04 05:43:56

回答

3

沒有多少可以爲正在運行的程序做的。我唯一能想到的就是附加gdb調試器,停止進程並檢查內存。或者,確保您的系統設置爲保存核心轉儲,然後使用kill --sigsegv <pid>終止進程。然後,您應該可以使用gdb打開核心轉儲,並在閒暇時進行檢查。

有一些gdb宏可以讓你檢查python數據結構並從gdb內部執行python代碼,但爲了這些工作,你需要編譯啓用了調試符號的python,我懷疑你的情況。首先創建核心轉儲,然後用符號重新編譯python將不起作用,因爲所有地址都將從轉儲中的值中更改。

下面是從gdb的自省蟒蛇一些鏈接:

http://wiki.python.org/moin/DebuggingWithGdb

http://chrismiles.livejournal.com/20226.html

或谷歌的 '蟒蛇GDB'

注:使用ulimit命令設置linux來創建coredumps。

ulimit -a會告訴你當前的限制設置爲什麼。

ulimit -c unlimited將啓用任何大小的核心轉儲。

+0

太糟糕了。儘管如此,這聽起來很有用,所以我會給它一個機會。感謝您的詳細回覆。 – Shahin 2010-10-04 15:30:23

0

+1非常有趣的問題。

我不知道這可能對你有多好(特別是因爲我不知道你是否會在程序中重複使用醃製列表),但我會建議這樣做:當你寫入磁盤時,打印將該列表列出到STDOUT。當你運行你的Python腳本(我在命令行還猜測),輸出重定向到附加到文件像這樣:

python myScript.py >> logFile. 

這應該所有列表存儲在日誌文件中。 這樣,您可以隨時查看logFile中的內容,並且您應該擁有最新的數據結構(取決於您打印的地方)。

希望這有助於

1

雖然當然不是很漂亮,但您可以嘗試通過proc文件系統訪問您的進程的數據../proc/[pid-of-your-process]。 proc文件系統存儲了大量的每個進程信息,例如當前打開的文件指針,內存映射等等。通過一些挖掘,你可能能夠訪問你需要的數據。

我仍然懷疑你應該從python內部看這個,並做一些運行時日誌記錄&調試。

0

This answer有關於將gdb附加到python進程的信息,其中包含宏,該宏會在該進程中使您進入pdb會話。我沒有嘗試過,但得到20票。聽起來你可能最終掛了應用程序,但似乎在你的情況下值得冒這個風險。

相關問題