[python] 最近工作感想

最近寫py遇到一個很大的瓶頸,就是py25無法釋放memory而導致MemoryError,這整個讓我信心大失... 好在瑋任大大的幫忙與建議,又重拾信心。

主要是因為 py 雖有 gc,但是網路上說 py 再做 gc 時並不會釋放記憶體給 OS,即使是使用 del() 或手動 gc.collect() 都無解,導致最後 memory 被我程式吃光光。
(那篇文章說py25已解決這個問題,但是我測過後是沒有!!? 可惡...)
最後是改用py26才暫時解決問題(日後應該將memHandler列入工作項目之一),然後也使用兩個幫助很多的工具,processexplorer 跟 guppy ,分別觀察process的行為與python內部memory使用情形。

一開始我是在網路上找尋如何觀察python記憶體使用的工具,學長推薦蠻不錯的有PythonMemoryValidator(功能十足,但是要$) 跟 dowser (cherrpy開發的程式,需要安裝cherrypy)。

另外也有人提到使用 ctype 去call win32的Object,我試了可是跑出來的東西跟processexplorer顯示的資訊不相符.... 而且似乎僅做一次MemoryStatus,幫助不大...

回顧一下整個事件的發生,真的是因為
1. python 的gc 我不熟它的實作方式,自以為他會自動調整memory
2. twisted我也沒真正看過他的底層,不知道就竟他耗掉多少memory
因為秉持的python絕對不會有錯 + twisted那麼多人用怎沒人討論過這個問題 =>結論,我程式碼有錯,害我花了三天在努力看codes跟找解法....(若沒有大家的幫忙大概我要看上一個月了 /囧\rz)

anyway,經過這次慘痛教訓後,下次真的要記得使用其他語言或framework時,最好還是事先了解它的精神及trace它一些重要的實做方式再來決定是否使用...(重寫真不是開玩笑的...)

既然 python 是用 circular reference counting 去決定reuse 或delete objects,應該有讓 user 使用的tmp方式吧,不然若只是單純要寫一個很大但只讀一次的檔案,等到下次gc執行之前都不准使用不就GG了,果然有個 weakref 或是瑋任建議的 mmap 。

不過試過後不太知道weakref的使用時機,另外mmap的offset只適用int(即2^32bytes以下),所已針對2G以上的File,無法使用的樣子...(殘念)  看來還是需要 ftruncate(), lseek(), read()/write()... 很好...

Comments

Popular posts from this blog

股票評價(Stock Valuation) - 股利折現模型

openwrt feed的使用

R 語言:邏輯回歸 Logistic Regression using R language (二)