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数组永远保持有序,方便二分查找。

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