有道詞典 Andriod 版本資料格式分析

2021-09-02 10:46:22 字數 1803 閱讀 4713

其實很簡單無聊

基於版本 5.3 分析。

其實也簡單分析了有道詞典ios版本,必應詞典的各個版本,以及金山詞典的各個版本,還有那個一直逍遙法外的林格斯詞典。

由於在各個平台上的限制,同一詞典的不同版本大多都採用了不用的實現方式。

一般 pc 版和 ios 版本都有一定程度的加密,而 andriod 版本則比較單純。可能是 andriod 硬體千差萬別,不敢做額外消耗 cpu 的處理。

基本索引和詞典分開

這是大多數詞典都幹了的事情,包括 pc 本地詞典。基本索引就是在輸入的時候給與下拉提示的部分,一般會給幾個備選的單詞以及非常精簡的釋意。

而真正查詢某個詞的時候,則單獨呼叫其他本地詞典,已經網路 api。效能的考慮,很好理解。

這個「基本索引」,在不同詞典上實現不一。必應詞典使用 sqlite,有道詞典使用分割的文字檔案。sqlite 很好理解,有道詞典選擇本地檔案,可能是為了省記憶體。

ios 版本上,大家對基本索引處理比較自在。

如有道詞典 ios 版本,這個基本索引是放在兩個巨大的資料檔案裡,加起來有40mb,可想而知為什麼有道詞典的 ios 版本為什麼比較慢,可能測試機的效能較好,他們無所謂。

有道詞典的索引檔案

有道詞典選擇本地檔案存索引資料,可能是為了省記憶體。嗯,畢竟現在一些無聊軟體,專門給你列記憶體占用列表。

這方案的確可行,因為現在手機使用的儲存並不慢,把資料分割,用哪塊取哪塊,也不慢,而且記憶體占用極小。

整個資料大概40mb,有道把他們分成256塊,中到英128塊,英到中128塊。

每塊呢有兩個檔案,乙個idx相當於單詞列表,乙個def,相當於詞典。這也很好理解,在idx裡找到了詞,那麼在def裡,對於的位置就能找到具體資料。此外還有乙個塊的索引,列出了每個檔案的第乙個單詞。

從需求的角度,當你輸入乙個東西,需要給與提示。需要使用 1 到 2 個塊(因為輸入的內容可能剛好在塊的邊緣),那麼從數學角度,占用記憶體大概是 400k,這比40mb 還是差很遠的。而實際上,英中詞典並不大,一般僅有 60000-100000,這樣的資料量就算線性處理都是非常快的,如果加上簡單的索引,完全沒有必要呼叫第三方資料庫。

idx 和 def 格式

idx 格式和 def 格式也是非常簡單。是一種在流處理裡很常見的方式: 的陣列。大端16位數字代表長度,後面跟著的是與這個長度相符的字串。

idx 檔案裡,這個字串就是單詞,而在 def 裡,這是個 json 格式。

以 def 為例,可以使用php這樣讀取

$count = 0;

for ($i=0; $i<128; $i++) {

$file = fopen('e2c_'.$i.'.def', 'r');

while($head = fread($file, 2)) {

// 之前做過預判,沒有異常資料

$size = unpack('n', $head)[1];

$string = fread($file, $size);

$dict = json_decode($string, true);

// 這個 dict 就是單個詞典的資料

$word = $dict['word'][0]['return-phrase']['l']['i'];

// 單詞

echo $word."\r\n";

foreach ($dict['word'][0]['trs'] as $tr) {

$tr = $tr['tr'][0]['l']['i'][0];

// 解釋(可能有多個)

額外地,這些 json 資料冗餘嚴重,簡單的處理完全可以減少到 30mb。

版本資料庫 未來方向

我想很快發布sirixdb 1 的1.0.0版本,但是卻缺少乙個開放源 社群,我想在這裡討論您認為對未來發展方向最重要的內容。為了簡短起見,sirixdb通過巨大的完全基於寫時複製的索引嘗試結構將資料庫中每個資源的歷史記錄保留下來。這意味著它在修訂版之間共享未更改的資料庫頁面。sirixdb允許進行...

SQL 高版本資料庫恢復到低版本

資料庫 sqlpersistenceservice 的版本為 655,無法開啟。此伺服器支援 611 版及更低版本。不支援降級路徑。無法開啟新資料庫 sqlpersistenceservice create database 中止。原因 版本655指的是sql2008,版本611指的是sql2005...

不同版本資料庫的exp imp問題

一般來說,從低版本匯入到高版本問題不大,麻煩的是將高版本的資料匯入到低版本中,在oracle9i之前,不同版本oracle之間的exp imp可以通過下面的方法來解決 1 在高版本資料庫上執行底版本的catexp.sql 2 使用低版本的exp來匯出高版本的資料 3 使用低版本的imp將資料庫匯入到...