Archive for 二月, 2009

再見了! Plone

二月 12th, 2009

終於,跟Plone說再見了,原因出在於最後一根稻草,來自主機商的自動訊息,說Plone的資料庫檔案超過500MB,需要執行清理的動作,雖然不是必要的,但是他的資料庫檔案會越來越大,我受不了了,為了Plone我已經升級了主機方案,記憶體還是超過限制,還弄了script去監視Plone記憶體使用量,定期重開,真搞不懂Plone到底是吃什麼長大的,就算不是歐落肥也是很營養的東西,當時就決定要把網站搬到其它CMS去,Joomla最近看起來蠻紅的,評估了一下就決定選擇Joomla,就在剛才處理伺服器的檔案,Plone的資料庫已經成長到了1.5GB….裡頭到底塞了什麼真令人好奇,然而我執行了清理之後只剩18MB,這之間的落差到底是從哪生出來了….Plone真的是怪獸中的怪獸,不過,早該跟這頭怪獸做個了斷

我花了一天的時間寫了一個小爬蟲爬了Plone的文章,然後用Joomla的XML RPC API傳文章上去,最後終於完成了,該是跟Plone說再見的時候了

新的Joomla!

第一次遇到Deadlock

二月 10th, 2009

凡事都要來個第一次,這兩天遇到一個deadlock,是我第一次遇到deadlock,其實很多deadlock都很明顯可以避免掉,但有些就不明顯,這次遇到的deadlock,是因為正在開發一個DirectShow的應用程式,我使用Python把核心部份寫好包裝成Extension給Python使用來加速開發,不然每次光等編譯就等到睡著

我使用DirectShow 的 Sample Grabber filter來抓取從DirectShow播放出來的音樂,DirectShow的graph會建立一個thread來處理事情,而它使用一個callback來回傳資料,好死不死,我的程式從Python的程式碼的Main thread呼叫graph的stop,但是stop似乎會等callback回傳,再來又好死不死的,callback因為要把資料丟回Python,要求Python的GIL,所謂的GIL就是Python直譯器的lock,整個Python行程只有一個,所以就變成下列情況

Main thread (hold GIL) -> call stop(Wait for callback) -> Callback acquire GIL -> GIL….(Hold by main thread)

囧…

這幾個笨蛋(設計的人比較笨),就這樣一直癡癡地等下去,等到天荒地老都沒有人會理他們,這真是悲慘….,所以在寫multi-threading的程式時一定要特別小心,明顯的deadlock當然是很容易避免,但是像這種文件上沒說清楚,隱涵著lock,又繞了一圈的情況,就很難一開始想到

提升效能 : 資料對齊

二月 3rd, 2009

程式通常都被要求要先把事情做對,再來要求效能,很多人常把事情倒過來做,我以前也喜歡這樣做,為什麼? 因為想要提升效能需要很多瑣碎的知識,當你知道一樣新的想法可以讓程式更快,就會想迫不急待的把它加到你的程式裡,但是程式執行結果都未必正確的情況下,這樣做只會增加程式的複雜度,結果都不正確了,跑再快又有什麼用? 但是到了真正到了把事情做對之後,就是到了開始恨自己瞭解的東西太少,我開始回想以前那些零碎的知識片段,看見我的程式存取記憶體,還有指標,讓我想起了一個重要的概念,資料對齊,這是一個很重要的概念,當資料的位址或長度不是CPU善長處理的數值時,CPU就需要花更多時間去處理,這也就是為什麼資料需要對齊的原因,會發現這個概念是因為我以前在寫struct寫入檔案時一直遇到一個莫明奇妙的bug,我發現struct的大小比我預料的大,後來才知道是資料對齊,編譯器自動將它填到對齊好的大小,現在我回想起來,找了一下,找到了一篇很不錯的文章,圖文並茂地說明了資料對齊的概念

Data alignment: Straighten up and fly right

當瞭解資料對齊的概念之後,就會明白為什麼buffer的長度常常會取256, 512, 1024等等數字