2
、
hash
表
spill
机制
2.1 spill
写
)首先通过
agg_hash_inial_pass
构建
表,会将所有值都处理一遍,若内存中放
不下,则将
表溢出写磁盘腾出空间后,继续构建
表。处理完成后(溢出
磁盘场景),所有值都在磁盘临时文件中进行了分组。实际上,每个
桶映射
到一个文件中,若
桶数大于临时文件个数,则多个
桶会映射到一个文件
中。如此,最后相当于将元组进行了一次粗略分组,写到各个临时文件中
)
(
的
spill_hash_table
函数就是将
表溢出到磁盘,然后通过
%%#!"'
继续插入
表
)最后一批
表内存中的数据
)*+,
也需要溢出磁盘,不过此时会
调 用
!-*+! -!
函 数 将 每 个 临 时 文 件 通 过
BufFileEndCompression
释放压缩内存
.
)
spill_hash_table
函数首先通过
%
创建
个
/
,然后通过如下方式
写磁盘:从最后一个
文件 号 开 始依次向 前 遍 历,比如 先 将
号桶写 到
/01
中,然后再将
23
号桶也写到
号,向后按照
的步长写桶;
写完后再向前遍历,即处理
4
号桶,再按照上面方式写磁盘。写一个临时文件时,
若开启压缩的话,会调用
! -5!(*+!6"7%8"%
开启压缩
需要注意的是:使用的是
压缩算法,虽然性能不错,但是比较耗内存,不论向该文件
写多少内容,大概一个文件都需要
9:
,当临时文件特别多的时候,内存耗费就相当大
评论