為什麼倒排表的分塊方案採用固定數目(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 按需求...