PalDB 詳解

簡介

PalDB 是 Linkedin 公司開源的一款只讀型的 KV 存儲數(shù)據(jù)庫轰坊,目的是在某些場景下替代 HashMap/HashSet 或 LevelDB火本,在性能和內(nèi)存之間做了一個良好的平衡灭贷。下面是官方給出的測試圖表:

讀的吞吐量是 leveldb 和 rocksdb 的5倍
內(nèi)存使用是 hashset 的1/6

使用方式

作為一個存儲工具包温学,其使用方式也很簡單,一看就會明白:

//寫數(shù)據(jù)
StoreWriter writer = PalDB.createWriter(new File("store.paldb"));
writer.put("foo", "bar");
writer.put(1213, new int[] {1, 2, 3});
writer.close();
//讀數(shù)據(jù)
StoreReader reader = PalDB.createReader(new File("store.paldb"));
String val1 = reader.get("foo");
int[] val2 = reader.get(1213);
reader.close();

應(yīng)用場景

PalDB 適合一次寫入甚疟,多次讀取仗岖,且數(shù)據(jù)量較大的場景,如:

  • Hadoop/Spark 計算時產(chǎn)生的一些中間結(jié)果
  • 機器學習訓練出的模型
  • 詞典

實現(xiàn)原理

PalDB 本質(zhì)上是一個哈希表览妖,用開放尋址法處理哈希沖突轧拄。下面從讀寫兩方面來分析其實現(xiàn)細節(jié)。

寫數(shù)據(jù)的過程主要分為3塊:序列化讽膏,預寫入檩电,最終寫入。

  1. 序列化:序列化過程主要負責將準備寫入的 key-value 值進行序列化。PalDB 自己實現(xiàn)了對 java 基本對象的序列化俐末,對數(shù)據(jù)進行了一定的壓縮(如果覺得壓縮的仍不夠料按,PalDB 默認支持 Snappy 壓縮算法,可手動開啟)卓箫。

  2. 預寫入:程序每調(diào)用一次 writer.put(Object key, Object value) 载矿,PalDB 就進行一次預寫入。預寫入負責寫兩類文件:

  • 索引文件:存儲 key 以及 value 在數(shù)據(jù)文件中的位置
  • 數(shù)據(jù)文件:存儲 value 長度以及 value

這兩類文件都有一個或者多個烹卒,成對出現(xiàn)闷盔,文件數(shù)量決于 key(序列化后)的長度,一個 key 長度對應(yīng)一對<索引文件旅急,數(shù)據(jù)文件>逢勾。也就是說,key 長度是一個一級索引藐吮,這個在讀的時候會用到敏沉。下面用一張圖總結(jié)下預寫入的過程。


預寫入工程

預寫入過程中還會記錄一些重要的值炎码,如:value 位置的最大長度盟迟,key 總數(shù)以及每個 key 長度下的 key 數(shù)量。

3.最終寫入
當寫完數(shù)據(jù)最終調(diào)用 writer.close() 時就進入最終寫入階段潦闲。預寫入生成的索引文件只是順序的存儲了 key 以及 value 在數(shù)據(jù)文件中的位置攒菠,最終寫入階段負責將索引文件轉(zhuǎn)化成哈希表,跟索引文件一樣歉闰,每一個 key 長度對應(yīng)一個哈希表辖众。對每一個哈希表:

  • 哈希表 slot 數(shù)量 = 該 key 長度下的 key 數(shù)量 / loadFactor(默認0.75,可手動指定)
  • 每個 slot 的大小是固定的和敬,等于 key 長度 + value 位置的最大長度(因此凹炸,slot 里的數(shù)據(jù)其實是有部分空閑的)。

寫這個哈希表的過程是順序讀預寫入階段生成的索引文件昼弟,按 key hash 到指定 slot(用開放尋址法處理哈希沖突)并寫入 key 以及 value 位置的過程啤它。
遍歷處理完所有 key 長度對應(yīng)的索引文件后,將所有哈希表舱痘、數(shù)據(jù)文件变骡、meta 信息拼接,形成最終的數(shù)據(jù)庫文件芭逝。文件結(jié)構(gòu)如下:


最終數(shù)據(jù)庫文件結(jié)構(gòu)

首先 PalDB 會將數(shù)據(jù)庫文件初始化塌碌,初始化過程分為三步:

  1. 讀取 meta 信息,如 key 數(shù)據(jù)旬盯,key 長度數(shù)量台妆、每個 key 長度對應(yīng)的索引文件 slot 數(shù)等翎猛,并存儲在內(nèi)存中。
  2. 以一個只讀內(nèi)存映射文件方式(MappedByteBuffer)打開 key 索引集合接剩。由于 PalDB 將 key 索引集合當做一個文件打開办成,由于內(nèi)存映射文件的大小限制,key 索引集合的大小不能超過 2G搂漠。
  3. 以一個或多個只讀內(nèi)存映射文件方式打開數(shù)據(jù)文件集合迂卢。如果數(shù)據(jù)文件過大(大于2G),PalDB 會將其切分成多塊桐汤。

初始化完成后而克,就可以調(diào)用 reader.get(Object o) 方法進行數(shù)據(jù)讀取,數(shù)據(jù)讀取的流程如下:


讀取數(shù)據(jù)流程

總結(jié)

PalDB 的實現(xiàn)原理還是比較簡單的怔毛,但是在某些場景下效果會比常規(guī)方法更好员萍。就筆者的實踐來說,用 PalDB 存儲推薦模型來代替之前的文件 load 到內(nèi)存的方式拣度,在性能影響很小的情況下大大減少了內(nèi)存的使用碎绎,值得一試。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末抗果,一起剝皮案震驚了整個濱河市筋帖,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌冤馏,老刑警劉巖日麸,帶你破解...
    沈念sama閱讀 217,826評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異逮光,居然都是意外死亡代箭,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,968評論 3 395
  • 文/潘曉璐 我一進店門涕刚,熙熙樓的掌柜王于貴愁眉苦臉地迎上來嗡综,“玉大人,你說我怎么就攤上這事杜漠〖埃” “怎么了?”我有些...
    開封第一講書人閱讀 164,234評論 0 354
  • 文/不壞的土叔 我叫張陵碑幅,是天一觀的道長戴陡。 經(jīng)常有香客問我,道長沟涨,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,562評論 1 293
  • 正文 為了忘掉前任异吻,我火速辦了婚禮裹赴,結(jié)果婚禮上喜庞,老公的妹妹穿的比我還像新娘。我一直安慰自己棋返,他們只是感情好延都,可當我...
    茶點故事閱讀 67,611評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著睛竣,像睡著了一般晰房。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上射沟,一...
    開封第一講書人閱讀 51,482評論 1 302
  • 那天殊者,我揣著相機與錄音,去河邊找鬼验夯。 笑死猖吴,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的挥转。 我是一名探鬼主播海蔽,決...
    沈念sama閱讀 40,271評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼绑谣!你這毒婦竟也來了党窜?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,166評論 0 276
  • 序言:老撾萬榮一對情侶失蹤借宵,失蹤者是張志新(化名)和其女友劉穎刑然,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體暇务,經(jīng)...
    沈念sama閱讀 45,608評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡泼掠,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,814評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了垦细。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片择镇。...
    茶點故事閱讀 39,926評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖括改,靈堂內(nèi)的尸體忽然破棺而出腻豌,到底是詐尸還是另有隱情,我是刑警寧澤嘱能,帶...
    沈念sama閱讀 35,644評論 5 346
  • 正文 年R本政府宣布吝梅,位于F島的核電站,受9級特大地震影響惹骂,放射性物質(zhì)發(fā)生泄漏苏携。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,249評論 3 329
  • 文/蒙蒙 一对粪、第九天 我趴在偏房一處隱蔽的房頂上張望右冻。 院中可真熱鬧装蓬,春花似錦、人聲如沸纱扭。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,866評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽乳蛾。三九已至暗赶,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間肃叶,已是汗流浹背蹂随。 一陣腳步聲響...
    開封第一講書人閱讀 32,991評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留被环,地道東北人糙及。 一個月前我還...
    沈念sama閱讀 48,063評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像筛欢,于是被迫代替她去往敵國和親浸锨。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,871評論 2 354

推薦閱讀更多精彩內(nèi)容