没有合适的资源?快使用搜索试试~ 我知道了~
HashMap优化及其在列存储数据库查询中的应用_母红芬1
需积分: 0 0 下载量 15 浏览量
2022-08-04
15:09:12
上传
评论
收藏 3.26MB PDF 举报
温馨提示
试读
12页
背景及相关工作哈希技术在大数据环境下应用广泛,能实现海量数据的高效插入和查询。本章主要介绍哈希技术的研究进展,哈希技术在列存储数据库分组和连接查询中的应用,以及
资源详情
资源评论
资源推荐
HashMap 优化及其在列存储数据库查询中的应用
*
母红芬
1
,李 征
1+
,霍卫平
2
,金正皓
2
1. 北京化工大学 计算机系,北京 100029
2. 北京东方国信科技股份有限公司,北京 100102
HashMap Optimization and Its Application in Column-Oriented Database Query
MU Hongfen
1
, LI Zheng
1+
, HUO Weiping
2
, JIN Zhenghao
2
1. Department of Computer Science, Beijing University of Chemical Technology, Beijing 100029, China
2. Business-Intelligence of Oriental Nations Corporation, Beijing 100102, China
MU Hongfen, LI Zheng, HUO Weiping, et al. HashMap optimization and its application in column-oriented
database query. Journal of Frontiers of Computer Science and Technology, 2016, 10(9):1250-1261.
Abstract: HashMap has been widely used to retrieve big data because of its constant level in average performance of
dictionary operations. Block_HashMap (BHMap) is based on C++ HashMap, in which three optimizations are intro-
duced: Hash function selection, conflict resolution and keyword matching. Conflict resolution is the core of optimiza-
tion, where Block_list, a storage structure based on the chain address method, is proposed to use cache efficiently and
save matching time by store hashcode. In the situation of limited bucket number and low data repetition rate, experi-
ments show that although it consumes a small amount of memory, BHMap has a 3.5 times of C++ unordered_map and
10 times of Map in terms of query speed. In column- oriented database, group by and join are the most commonly
used, in which bucket keywords, resolving conflict and matching keywords are all Hash based. Finally the application
of BHMap in the query of column-oriented database is provided.
Key words: HashMap; group by; join; cache-conscious; cache-oblivious; column-oriented database; BHMap
* The National Natural Science Foundation of China under Grant Nos. 61170082, 61472025 (国家自然科学基金); the New Century
Excellent Talents Foundation from MOE of China under Grant No. NCET-12-0757 (教育部新世纪优秀人才支持计划); the Scientific
Research Foundation for the Returned Overseas Chinese Scholars, State Education Ministry of China under Grant No. LXJJ201303
(教育部留学回国人员科研启动基金).
Received 2015-07, Accepted 2015-10.
CNKI 网络优先出版: 2015-10-29, http://www.cnki.net/kcms/detail/11.5602.TP.20151029.1704.002.html
ISSN 1673-9418 CODEN JKYTA8
Journal of Frontiers of Computer Science and Technology
1673-9418/2016/10(09)-1250-12
doi: 10.3778/j.issn.1673-9418.1507065
E-mail: [email protected]
http://www.ceaj.org
Tel: +86-10-89056056
母红芬 等:HashMap 优化及其在列存储数据库查询中的应用
1 引言
随着云计算与大数据的广泛应用,大数据集的
实时动态分析成为研究热点。高效的数据查询、分
析操作是实现该目标的重要技术手段。
在大数据技术中,HashMap 查找速度快,查询、
插入、删除操作的平均复杂时间度为
O(1)
,属于常数
级别,查询时间与数据集大小无关。在众多数据库
如 Oracle、MonentDB/X100
[1]
、C-Store、Microsoft SQL
Server 2012
[2]
等都使用了 HashMap。
HashMap 是基于哈希表的数据结构,按照
key
值
给每一个元素分桶,使用哈希函数对
key
值操作,返
回哈希值,然后再将
(key,value)
存放到 hashcode 对应
的桶中。哈希函数的选取直接影响分桶的效率,而
对于不同的关键字,经过哈希函数分桶,出现了相同
的哈希值,就会产生“冲突”。
传统解决冲突的方法是链地址法,即将冲突的
数据以指针链表的方式存储在相应的桶后,当系统
分配的桶数目不够时,进行 rehash,重新申请桶。使
用链表方式来存储
(key,value)
,在匹配查找过程中,
会频繁地读取指针指向的内存。随着数据量的增
大,时间消耗也急剧增大;同时 rehash 策略动态增加
桶数目也会引起新的时间开销。
国内外对 HashMap 的研究主要集中在使用该结
构体实现数据的高效查询和插入,大部分直接使用
封装好的接口,很少对该结构进行优化。
本文针对上述情况,考虑分桶效率、缓存利用率
和匹配效率,对 HashMap 提出以下优化策略:(1)在
哈希函数分桶过程中,使用“按位与”操作代替传统
的“取模”操作,缩短定址时间;(2)在解决冲突时,使
用“块链地址法”取代现有的“链地址法”,提出存储
结构 Block_List,减少指针寻址时间;(3)在匹配查找
时,在结构体中增加存储哈希值,将匹配字符串
key
值改为匹配数值型哈希值,节省查找时间。结合以
上 优 化 策 略 ,提 出 一 种 数 据 结 构 BHMap(Block_
HashMap),用其解决 传 统的 HashMap 在桶数目有
限,数据
key
重复率较低情况下的性能瓶颈,最后将
BHMap 应用于列存储数据库中,以提高查询效率。
本文通过一个基准的计数应用在千万级数据集
上验证 BHMap 的性能,并与 C++标准库的 Map 和
unordered_map 进行比较,结果显示,当桶数有限,数
值重复率较低时,BHMap 只在增加少部分内存消耗
的情况下,查询速度就能比 unordered_map 快 3.5 倍
以上,比 Map 快 10 倍以上。本文给出了 BHMap 的优
化方法以及调用 API,通过在列存储数据库的分组和
连接查询中使用该数据结构,说明其在大数据查询
中的适用性。
2 背景及相关工作
哈希技术在大数据环境下应用广泛,能实现海
量数据的高效插入和查询。本章主要介绍哈希技术
的研究进展,哈希技术在列存储数据库分组和连接查
询中的应用,以及Cache利用率对数据库查询的重要性。
2.1 哈希技术
哈希技术由于其高效性、不可逆性以及唯一性,
摘 要:HashMap 在基本字典操作中具有常数级别的平均算法时间复杂度,广泛应用于大数据的检索。
Block_HashMap(BHMap)基于 C++ HashMap,其优化包括三方面:哈希函数选取,冲突解决和关键字匹配。优
化核心在于冲突解决时,以链地址法为基础,提出了一种高效利用高速缓存的存储结构 Block_List 来存储冲突
的数据,并且预先缓存哈希值,节省匹配时间。实验证明,在桶数目充足的情况下,BHMap 会多消耗少部分内
存,但在桶数目有限,数据重复率比较低的情况下,时间性能上相对 C++标准模板库中的 Map 提升 10 倍以上,
比 unordered_map 快 3.5 倍以上,且消耗的内存与 unordered_map 相差不大。在列存储数据库分组和连接查询
中,关键字的分桶、解决冲突和匹配操作也都涉及到基于哈希的技术,最终把 BHMap 应用到列存储数据库的关
键查询中。
关键词:哈希图;分组;连接;缓存感知;缓存不敏感;列存储数据库;BHMap
文献标志码:A 中图分类号:TP311.132.3
1251
Journal of Frontiers of Computer Science and Technology 计算机科学与探索 2016, 10(9)
在信息系统的数据存储与访问中占有重要的地位
[3-4]
。
哈希技术将关键字直接映射为存储地址,达到快速
寻址的目的,即
Addr = H(key)
,其中
H
为哈希函数。
文献[5]考虑到在大数据环境下节省内存,使用
数组代替链表来提高定位速度,以减少遍历链表的
时间开销。由于大多数情况下,数据变化未知,使用
固定大小的数组要考虑最坏情况的冲突,会浪费许
多不必要的空间,而使用动态数组要花费很多时间
在内存分配上。本文提出的方法能够减少空间的浪
费,同时保证定位速度。
2.2 哈希技术在列存储数据库查询中的应用
列存储数据库在联机分析处理(online analytical
processing,OLAP)、商务智能、数据仓库等决策分析
领域逐渐被应用,其将关系表中的数据按字段分开
存储,执行查询时,仅从磁盘读取与当前查询相关的
列,有效节省了 I/O 带宽,避免不相干数据的读入,从
而能够极大程度地提高分析查询的效率。
在列存储数据库的查询操作中,分组(group by)
和连接(join)是最主要的,同时也是最费时的操作。
2.2.1 分组和连接
计算分组函数中时间开销最大的部分是执行
group by 子句,它结合合计函数(max,min,avg,sum),
根据一个或多个列对结果集进行分组。
分组主要有基于排序、基于哈希技术和基于嵌
套循环 3 种方式,Albutiu
[6]
从响应时间、健壮性、资源
利用率等方面比较了 3 者的区别,得出在数据量很大
并且无序的情况下,基于哈希的方法比其他两种分
组方式效率高。
在 Oracle 10gR2 中,分组由以前版本的 sort group
by 改成了 Hash group by,这种算法上的改进,取消了
sort group by 必须进行的排序操作。访问时间复杂度
从
O(lb n)
降低到了
O(1)
。
连接基于两个或多个表中列之间的关系执行查
询操作。比较经典的连接算法有嵌套循环连接、归
并排序连接和哈希连接。
哈希连接常用于大数据集连接
[7]
。使用两个表
中较小的表,利用连接键在内存中建立哈希表,然后
扫描较大的表并探测哈希表,找出与哈希表匹配的行。
通常情况下,哈希连接的效果要比嵌套循环连
接和排序合并连接好
[8-9]
。由于列存储数据库的数据
存储特性,一般采用哈希连接算法。
2.2.2 Cache 利用率
Cache 的高效访问也是数据库查询的一个重要
方面
[10]
。文献[11]对 4 种商业数据库的分组和连接进
行了测试,结果显示,CPU 等待时间占整个处理时间
的 50%以上。分析原因,90%是由于 L1 指令 Cache 失
效和 L2 数据 Cache 失效造成的。也就是说,数据库
系统的执行时间有很大一部分都花费在 Cache 和主
存之间的数据交换上
[12]
。
目前在加快数据处理操作方面,主要集中于对
Cache 感知
[13]
和 Cache 不敏感策略
[14]
的研究。本文借
鉴 COHJ(cache-oblivious Hash joins)
[15]
和 CONLJ(cache-
oblivious nested-loop joins)
[16-17]
的 Cache 不敏感策略,
对数据 库 join 查询 进 行 优化 ,提出数据 存 储结 构
Block_List,将冲突数据存入 Block 中,保证 Block 中
数据连续存放,并且设置合适的 Block 大小,使整个
Block 的内容能一次性存放在 Cache 中,提高命中率,
减少 CPU 的等待时间。
3 HashMap 优化
本文提出的 HashMap 优化策略包括:分桶时的
哈希函数优化;用链块地址法解决冲突;增加存储
hashcode
,提高
key
的匹配效率。
3.1 哈希函数分桶
哈希分桶的第一步是选取一个均匀的哈希函
数,使数据进入每个桶的概率相等,这对于数据存储
的平衡性及后期匹配效率都非常重要。
本文对哈希函数的改进参考 Java HashMap 的哈
希函数,将 HashMap 的容量设置为 2 的整数次幂,把
“mod”操作改为“位与”操作。
本文优化的哈希函数代码如图 1 所示。
该函数对
key
值进行操作,
bucket_num
代表桶的
数目,是 2 的整数次幂,具体大小由系统最大可分配
桶数目决定。将
hashcode
mod
bucket_num
操作改
为
hashcode
&
(bucket_num - 1)
,不但对分桶的概率没
有影响,还提高了运算速度。通过位与操作,得到
1252
剩余11页未读,继续阅读
易烫YCC
- 粉丝: 23
- 资源: 315
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0