2011-04-19 71 views
2

我已經寫了一些代碼,其工作沒有錯誤。該代碼使用MySQLdb進行(頻繁)數據庫訪問,並使用4個不同的數據庫。還會生成一些日誌文件並使用日誌記錄模塊。真正令人擔憂的是,運行Valgrind的時候,我得到以下Python2.4上的Valgrind:大量的內存'可能丟失'

==7840== LEAK SUMMARY: 
==7840== definitely lost: 29 bytes in 1 blocks 
==7840== indirectly lost: 0 bytes in 0 blocks 
==7840==  possibly lost: 1,104,793 bytes in 8,865 blocks 
==7840== still reachable: 70,684 bytes in 2,194 blocks 
==7840==   suppressed: 0 bytes in 0 blocks 

最大的泄漏

==7840== 393,216 bytes in 1 blocks are possibly lost in loss record 1,585 of 1,585 
==7840== at 0x4005903: malloc (vg_replace_malloc.c:195) 
==7840== by 0x204929E: ??? (in /usr/lib/libpython2.4.so.1.0) 
==7840== by 0x2054833: PyString_InternInPlace (in /usr/lib/libpython2.4.so.1.0) 
==7840== by 0x20A0362: ??? (in /usr/lib/libpython2.4.so.1.0) 
==7840== by 0x209FB15: ??? (in /usr/lib/libpython2.4.so.1.0) 
==7840== by 0x20A0075: ??? (in /usr/lib/libpython2.4.so.1.0) 
==7840== by 0x209FB15: ??? (in /usr/lib/libpython2.4.so.1.0) 
==7840== by 0x20A0068: ??? (in /usr/lib/libpython2.4.so.1.0) 
==7840== by 0x20A04CC: PyMarshal_ReadObjectFromString (in /usr/lib /libpython2.4.so.1.0) 
==7840== by 0x20A1D20: PyMarshal_ReadLastObjectFromFile (in /usr/lib/libpython2.4.so.1.0) 
==7840== by 0x209AA63: ??? (in /usr/lib/libpython2.4.so.1.0) 
==7840== by 0x209CB7E: ??? (in /usr/lib/libpython2.4.so.1.0) 
==7840== by 0x209D9B2: ??? (in /usr/lib/libpython2.4.so.1.0) 
==7840== by 0x209DE71: ??? (in /usr/lib/libpython2.4.so.1.0) 
==7840== by 0x209E087: PyImport_ImportModuleEx (in /usr/lib/libpython2.4.so.1.0) 
==7840== by 0x207DB2D: ??? (in /usr/lib/libpython2.4.so.1.0) 

所以你看,它顯示的內存幾乎1MB爲可能丟失。我的代碼是否存在一些真正的問題,或者是否使用了提供這種行爲的MySQLdb。爲了儘量減少它,我應該明白釋放對象(包括文件,數據庫連接)還是有我可以看看的python模塊?

+2

你爲什麼使用7歲的蟒蛇版本?這與使用PHP3而不是PHP5幾乎一樣糟糕(好吧,Python 2.4比現在的版本要好很多,但是無論如何) – ThiefMaster 2011-04-19 11:44:23

+0

我使用Scientific Linux,這是他們提供的版本。 – RedBaron 2011-04-19 11:48:35

+0

我相信你可以在某處獲得更新版本的RPM。 – ThiefMaster 2011-04-19 11:50:23

回答

5

Python使用自己的內存分配器在malloc上使用valgrind會導致問題。有關詳細說明,請參閱Misc/README.valgrind。假設您不打算重建Python,解決方案是使用Misc/valgrind-python.supp作爲壓縮文件,並取消其中的行,以禁止PyObject_FreePyObject_Realloc的警告。

+0

我曾經這麼認爲......但我也跑了'天真'測試(如果測試可以使用).. 。我啓動了系統監視器並記下了當前使用的內存量......然後運行我的代碼....它佔用了大約5 MB的內存....然後當代碼退出時,內存使用量回到預編程級別...我不是100%肯定的,但如果有一個大內存泄漏內存使用不會倒退...對嗎? – RedBaron 2011-04-19 12:26:40

+0

這取決於你的意思是通過運行代碼。即使存在內存泄漏,進程退出其內存時也會被釋放。當對象被銷燬並且代碼沒有內存泄漏時,python可能不會將內存返回給系統(保留以備將來使用)。檢測內存泄漏的唯一可靠方法需要在沒有「PyMalloc」的情況下重新編譯。 – 2011-04-19 12:46:39