談談lucene中的BytesRefHash

lucene中很多的數據結構都採用了個性化的實現,而且沒有利用一些通用的開源的其它框架,主要的目的還是爲了靈活可控、保證高效率、節約內存,BytesRefHash就是其中一個基本的、重要的、核心的數據結構。

根據lucene中給出的註釋,BytesRefHash是一個類似於HashMap的數據結構,但我個人認爲它更像一個ArrayList與HashSet的混合物。因爲它並不能像傳統的HashMap一樣存儲任意的key和value,只能基於元素的索引號與元素值進行一些簡單的讀取、判斷元素是否存在等功能。基於元素的索引號讀取元素類似於ArrayList,判斷元素是否存在(內部實現通過哈希算法實現)類似於HashSet。

在其內部有一個核心的類就是ByteBlockPool,基於該類可以保證數據在物理上的連續性,帶來的好處是提高數據的訪問效率,並節約內存空間。

關於提高數據的訪問效率比較好理解,因爲物理上連續的數據能更好的利用cpu cache。能節約內存空間主要是因爲java對象的內存佈局主要包含3個部分:對象頭、數據域和padding,而BytesRefHash主要是對BytesRef字節對象進行處理,通過對字節對象的合併連續存儲能夠減少對象頭和padding佔用的空間,從而節約內存。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章