tablesaw 內存模型分析

tablesaw 內存模型分析

1 UML圖

如下圖。用戶的操作接口爲Table,Row。其他的模型主要用於內部功能實現和數據存儲。
在這裏插入圖片描述

2 Table數據組織方式

Table的數據是以列的維度進行組織。Table包含一個columnList屬性,每個列都是這個列表的一個值。每個Column單獨維護自己的數據,但是長度都是相同的。所以取表長度的方式,就是columnList列表中獲得一列的長度。
tableSaw提供了行的角度來讀取數據。對象Row是用戶的操作接口。Row包含指向操作的table,以及當前的操作行id。獲取一行數據,就是遍歷每一列,獲得rowNumber對應的值,然後進行組裝。

3 Column數據存儲

Column的實現有很多種,基本類型支持爲:Date,Datetime,Time,Boolean,Number,Text,String。
這裏只介紹String的實現。
作者假設StringColumn的存儲數據值的範圍是有限的,比如商品類型,貨物類型。這樣就會出現大量的重複存儲(比如貨物中有10000件商品是書,那麼類型book就需要存儲10000次)。tableSaw採用了位圖的映射方式:如果是相同的值,那麼只會存一次值,其他的都是指向這個值。
values是內部映射的id。可以根據此id以及keyToValue,快速找到值是多少。
位圖的實現方式:
value計算hash值:hashvalue
在列表的hashvalue對應位置,存放此value。因爲hashValue就是列表的位置,所以可以通過hashvalue快速找到value。
hash衝突。得到的hashvalue位置已經有oldvalue,但是oldvalue!=value,發生了hash衝突。那麼會試探hashValue+1的位置是否空閒。如果不空閒,則繼續+1,直到找到空閒的位置。
查找的時候也是類似:得到hashValue,對應的value是否是目標,如果不是就探查hashValue+1位置。如果對應的位置沒有信息或達到位圖的最大值,則認爲沒找到。

4 索引

tableSaw的索引並沒有在查詢中使用,而是用於join的實現。
DataFrameJoin是join的實現類。當執行table的join操作時,DataFrameJoin會對join的column建立index,從而實現join操作。
Index操作都是採用簡單的Map<key,Collection>形式存儲,只會支持快速查找定位,不支持排序分組等操作。

5 排序

tableSaw的排序都是現用現排序,沒有預先的索引加速處理。

6 查詢結果:Selection

Selection用於承載查詢結果。
Column通過各種方式過濾後,將過濾後的行號信息,存儲到Selection中。Table.where 中拷貝Selection的所有行數據到新的Table中。
Selection 採用的唯一實現:BitmapBackedSelection,採用了RoaringBitmap存放行號,加快查找排序速度。
RoaringBitmap實現原理(摘自網絡
每個RoaringBitmap中都包含一個RoaringArray,名字叫highLowContainer。highLowContainer存儲了RoaringBitmap中的全部數據。組織結構如下圖。
RoaringBitmap會將32位的整形(int)拆分成高16位和低16位兩部分(兩個short)來處理。
RoaringArray的數據結構很簡單,核心爲以下三個成員:

short[] keys; 
Container[] values;
int size;

每個32位的整形,高16位會被作爲key存儲到short[] keys中,低16位則被看做value,存儲到Container[] values中的某個Container中。keys和values通過下標一一對應。size則標示了當前包含的key-value pair的數量,即keys和values中有效數據的數量。
keys數組永遠保持有序,方便二分查找。

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