問題java
由於須要加載一個 近 1G 的字典到Hanlp中,一開始使用了CustomDictionay.add() 方法來一條條的加載,果真到了中間,維護DoubleArraTre 的成本過高,添加一個節點,都會很長時間,原本時間長一點沒有關係,只要訓練出.bin 的文件,第二次加載就會很快,然而做爲以空間換時間的DAT結構,內存消耗很大,預料以內的出現了函數
1 out of memory: heap size優化
的問題。後來嘗試直接加載了1G 的字典,顯然更不行。spa
思路blog
閱讀了Hanlp的部分源碼,也請教了原做者一部分問題,就打算從源碼入手。初步想法大概是將原始字典 split 成多份,而後分別將多份的小字典 訓練成 多個小的.bin 文件,再完整的加載到內存中,基於的原則則是:加載兩個10M的字典的消耗比一個20M的要小。內存
而後又優化了一部分,如今加載一個大概1G的字典,佔內存約3g+ ,已經可使用了。源碼
大概流程hash
1 修改 CustomDictionary.java 設置一個 hashmap 或者 一個 list 來存儲全部的小Datit
2 將全部的dat加載完,這裏就再也不區分主副字典了。io
3 修改Segment.java裏面的combineByCustomDictionary 函數,源碼中只有一個dat, 這裏咱們須要選擇咱們容器中其中某一個dat做爲要匹配使用,以前使用的方案是,遍歷全部的dat,知道有了匹配,可是這樣缺陷很明顯,解決不了多個字典匹配同一個詞的字串的狀況,這裏個人考察方案是,字典中的同一個字開始的詞條映射到同一個文件,這樣不會出現字串問題了。
以上就是個大概的修改,能夠參考。
---------------------
做者:ShomyLiu