2007/06/17

[Computers, Diary] 牽一髮動全身,改一行跑兩天

原本我以為這學期的專題已經夠殺 CPU 時間了,
但開始寫了 IR 作業之後才發現,原來它才是本學期最終魔王 XD
我正在寫這篇 BLOG 的時候,作業還在家中的三號機上面跑,
而現在,它正在不停地發出過熱的警告 (抖)

看來我暑假還得要去採購新的散熱風扇「們」了。

因為在做專題的時候,已經有了一群程式碼可以跑,
星期五不假思索地將 classes 們放進來跑,天真如我,張開雙手以為撐得住未來
以為這樣就能夠順利的解決掉 >200 MB 的資訊。

但是,開始跑了之後我才發現,這世界上有一種東西叫 Murphy's Law,
簡單的說,便是 "Whatever can go wrong, will go wrong"
在麻煩之神還未得到滿足前,我是沒有辦法跑完我的作業的 (默)

那麼,是遇到了什麼狀況呢?

是這樣的,因為一號機的硬體配備不甚新,
RAM 也是勉勉強強才裝到 1GB,能夠用到現在算是奇蹟,
但或許是因為奇蹟是限量的,用完就沒有了,
也有可能是我的 coding 功力,或是採用的演算法不大理想,
總之,一萬筆資料到今天還是只能跑完四分之一 Orz

會造成程式 hang up 或是 crash 的原因,
是 testing corpus 裡面的詭異 token,有幾筆資料有超長 token,
而在 data structure 裡面,雖然可以容納這樣的資料,
可是在某些狀況下,由於輸出時用了固定配置的 buffer,
資料量過大時會出現記憶體溢位的問題。

雖然固定配置記憶體可以提高效能,
但這樣在跑到過大資料的時候,反而成了當機的主因;
要解決的話,要嘛就是全部用動態配置,
要嘛就是在溢位前進行處理,重新 allocate 一塊空間。

或者乾脆就不要配置記憶體,直接輸出成 binary files,
這樣似乎會更快一些?

嗯,我想,我應該會用這個方式吧。

正在寫這篇文章的時候,三號機還是不幸陣亡了,
所以剛剛改了程式,把不必要的 buffer 都拿掉了,
實在需要配到記憶體的也改採動態配置,效能會往下掉些,
但理論上.. 應該,呃.. 或許可以跑完吧?

總之它現在就是不疾不徐地在一號機上跑著,
記憶體佔用率也掉到原先的 1/4 以下,
看來改一行有時候還真的會收到滿驚人的效果呢 (驚)

20070617_tfidf

我還是很好奇,怎麼會有一篇文章 token 可以將近八萬的,
感覺上就是要把寫得不好的程式搞當啊 XD

也難怪,教授上課的時候會語重心長地要我們早點開始了。

嚴格地說,我的程式從星期五寫好到今天,改動不到廿行,
但是最後能 run 的方式卻是最小巧優雅的那個.. 嘖嘖。

這次作業也發現了很多 tricky 的字串處理法,
雖然 C 對於字串好像很沒輒,用 C++ 又稍嫌遲緩,
但漸漸熟悉混搭之後,處理起來還真是異常的快啊 ~_~||

看來電腦程式這塊領域,還真是適合混搭啊 (?)

寫好的這支程式,其實只需要跑過一遍,
輸出的 data 只要正確無誤,後面都不需要太費力氣,
凡事起頭難,希望之後這個作業不要再有起頭了 (汗)


[posted by cornguo @ CornGuo's BLOG, of murmurs]

沒有留言: