Using shared memory in libchewing
OVIMSpaceChewing 中有一段 constructor 的 code 如下,
ReadTree( dataDir );其中的 ReadTree、InitChar、InitDict 都是去讀取已經做好的資料表格或 index。幾乎都是 fscanf 到程式裡面的 structures,雖然是只有載入時才會執行,但是這樣每個有用到輸入法的 process 都會各自保有一份卻又相同的東西。且在每個 process 第一次切換到 Chewing 時候都要載入,感覺會頓一下(硬碟慢 XD)。
InitChar( dataDir );
InitDict( dataDir );
ReadHash( hashDir );
InitChewing(cd,cf);
這些 table 和 index 幾乎使用者不會去更改,所以從開機到結束或關電腦都是一樣的東西。乾脆就把他們丟到 shared memory(SHM) 去。只要第一個載入後,發現 SHM 中沒有這些東西,就自己 create & load 相關 structures;其他別的 process 再次使用輸入法時,就不用再去幹同一件事情,順便節省一下記憶體空間。
修改了之後,啟動新的 process 切換到 OV Chewing 似乎有快一點,不過 ReadHash 那邊還是個大問題待解決。當 hash.dat 變大,載入時間也會變長,hash 資料同步等等的問題。不過要改 ReadHash,還得解決 process 之間 synchronous 問題。擺在 SHM 不是好方法,因為 hash 會增加,且 mac os x 在開機時候 rc 就預設 SHM 最大 4MB。
Files: OVIMSpaceChewing.tar.bz2、OVIMChewing.dylib.bz2
張貼留言