答索引構造一問(續)

2021-08-25 07:52:48 字數 1957 閱讀 5583

為什麼倒排表的分塊方案採用固定數目(fixed number

)的,而不是固定大小(fixed size)

的?

解答:

cpu

流水線的有效性

fn方案中,由於確定數目,例如128

,則壓縮和解壓很容易做迴圈展開的優化,沒有分支指令。當然倒排表的最後可能不會正好是128

,需要padding

一些dummy

的docid

,但這種儲存損耗,如果有100k

詞條,每個詞條增加127

個padding

的,每個padding

按3個位元組(docid

,frequency, hitlist

)代價計算,則不過10m

而已,和解壓快速的收益看非常小。 fs

方案中,壓縮和解壓的過程中要反覆判斷是否跨塊,因此增加的if-then-else

這樣的branch

指令,使得cpu

指令**可能出現錯誤而導致流水線停滯(通常for

迴圈中是需要避免分支指令的,後面pfor-delta

的優化再詳細討論)。

從儲存的有效性上看

fn方案,儲存緻密,只是需要在最後乙個block

上padding

一些dummy

的docid。

fs方案,如果考慮到每個固定塊中需要存放docidlist

,freqency, hitlist

的話,那麼極容易出現跨塊,而使得每個block

的尾部空間都會有損耗,這個代價是極大的,因此fs

的這種方案就不易存放hitlist

,給設計帶來了侷限。

壓縮效果的可控性

fn方案,文件數固定,壓縮可控,文件數太少壓縮效果差,文件數太多解壓效率低,不容易出現skip

的情況。 fs

方案,大小很難固定,固定了大小,文件數也很難控制,文件數多少和壓縮效果緊密聯絡。

當然fs

的方案也不是一無是處,由於計算偏移容易(均為位元組位址),而fn

的方案不可避免的使用位元位址。此前的博文中已有討論,不再贅述。

為什麼說pfordelta

的壓縮方法,壓縮效果好,解壓速度快?

解答:

關於流水線角度的分析,請參見:

成片解壓,計算量低

pfordelta

事實上只是對exception

進行了特別處理,而其餘小於threshold

的數直接按照二進位制的形式訪問,因此讀取乙個位元組就可以獲得一片docid

。同時計算時只有加法,沒有乘除法,雖然其餘的編碼方式由於除的均為2

的倍數,因此可以通過移位來優化,但從計算的複雜度看,pfordelta

還是非常有優勢,因為看上去其實並沒有進行什麼「壓縮計算」一樣。

在docid重排(reordering)的情況下,pfordelta的提公升

docid重排問題比較複雜,這涉及到很好的支援docid的clustering,又要支援early termination(更好的docid要往前排),同時還必須這種重排方法要比較簡便,分配的docid要完全緻密,沒有人為的gap。

b值較小情況,block size = 128,而b低於5的情況下的優化

pfordelta演算法依賴於b值,而b值過小的情況下,無法在entry中存放下乙個exception的位置的偏移量,這種情況下需要特別的優化。

推薦閱讀:

答索引構造一問:

答索引構造一問(續)

為什麼倒排表的分塊方案採用固定數目 fixed number 的,而不是固定大小 fixed size 的?解答 cpu 流水線的有效性 fn方案中,由於確定數目,例如128 則壓縮和解壓很容易做迴圈展開的優化,沒有分支指令。當然倒排表的最後可能不會正好是128 需要padding 一些dummy ...

sdnu1096一問一答

1096.一問一答 time limit 1000 ms memory limit 32768 kb total submission s 174 accepted submission s 106 description 現在輸入乙個序列,這個序列中有n個數字,輸入時他們是無序的,而後他們會被寫到...

安防佈線的一問一答

1 監控的具體佈線方法?什麼樣的機子要什麼樣的線,要多少?從什麼位置到什麼位置?監控線纜 槍機 不帶雲台的攝像機 線 電源線 球機 帶雲台和解碼器 線 電源線 控制線 線型號 syv 75 5 1 2傳輸距離500公尺 syv 75 3 1傳輸距離300公尺 控制線型號 rvvp 2 1.0 按需求...