tim-wu
lucene之 节省磁盘空间的BitVector
org.apache.lucene.util.BitVector
这个小小的工具类用来保存bit数据,并且提供bit级别的boolean读写能力。
这部分能力类似
java
.util.BitSet
而有趣的地方在于BitVector提供了持久化的能力(保存到文件),
为节省磁盘空间:
if
(isSparse())
{
writeDgaps(output);
//
sparse bit-set more efficiently saved as
//
d-gaps.
}
else
{
writeBits(output);
}
首先判断数据中是否bit值为1的数据非常少,如果是,就采用Dgaps算法,
这种算法将压缩数据,结构如下
..
III(IB)+
第1个Int为标记位,值-1表示为Dgaps
第2个Int为数据长度(多少个bit)
第3个Int为数据有多少个bit值为1
而后循环,只保存Byte值非0的串
第1个Int保存和上一个便宜
第2个位为Byte,保存Byte值(也就是8位bit)
呵呵,看来做indexer真是啥都省着用啊
btw,判断数据中是否bit值为1的数据非常少的算法页很有趣
private
boolean
isSparse()
{
//
note: order of comparisons below set to favor smaller values (no
//
binary range search.)
//
note: adding 4 because we start with ((int) -1) to indicate d-gaps
//
format.
//
note: we write the d-gap for the byte number, and the byte (bits[i])
//
itself, therefore
//
multiplying count by (8+8) or (8+16) or (8+24) etc.:
//
- first 8 for writing bits[i] (1 byte vs. 1 bit), and
//
- second part for writing the byte-number d-gap as vint.
//
note: factor is for read/write of byte-arrays being faster than
//
vints.
int
factor
=
10
;
if
(bits.length
<
(
1
<<
7
))
return
factor
*
(
4
+
(
8
+
8
)
*
count())
<
size();
if
(bits.length
<
(
1
<<
14
))
return
factor
*
(
4
+
(
8
+
16
)
*
count())
<
size();
if
(bits.length
<
(
1
<<
21
))
return
factor
*
(
4
+
(
8
+
24
)
*
count())
<
size();
if
(bits.length
<
(
1
<<
28
))
return
factor
*
(
4
+
(
8
+
32
)
*
count())
<
size();
return
factor
*
(
4
+
(
8
+
40
)
*
count())
<
size();
}
发表于 2007-09-21 12:04
鹏飞万里
阅读(465)
评论(0)
编辑
收藏
新用户注册
刷新评论列表
只有注册用户
登录
后才能发表评论。
网站导航:
博客园
IT新闻
Chat2DB
C++博客
博问
管理
<
2007年9月
>
日
一
二
三
四
五
六
26
27
28
29
30
31
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
1
2
3
4
5
6
导航
BlogJava
首页
发新随笔
发新文章
联系
聚合
管理
统计
随笔: 28
文章: 0
评论: 38
引用: 1
常用链接
我的随笔
我的评论
我的参与
最新评论
留言簿
(4)
给我留言
查看公开留言
查看私人留言
我参与的团队
WebGIS开发设计组(0/0)
随笔档案
2008年2月 (4)
2008年1月 (6)
2007年12月 (2)
2007年11月 (2)
2007年9月 (8)
2007年3月 (1)
2006年5月 (4)
2006年4月 (1)
搜索
最新评论
1. re: 关于Javascript的内存泄漏问题的整理稿
很有帮助!谢谢
--selma
2. re: 关于Javascript的内存泄漏问题的整理稿
对象是值传递的,所以第一段代码不可能是js对象和dom对象的循环引用,而是dom自身的循环引用
--axiheyhey
3. re: 关于Javascript的内存泄漏问题的整理稿[未登录]
评论内容较长,点击标题查看
--鹏飞万里
4. re: 关于Javascript的内存泄漏问题的整理稿
评论内容较长,点击标题查看
--goofect
5. re: 关于Javascript的内存泄漏问题的整理稿
评论内容较长,点击标题查看
--goofect
阅读排行榜
1. 关于Javascript的内存泄漏问题的整理稿(18515)
2. 关于google map api中的球平投影算法接口: GProjection和GMercatorProjection类(4814)
3. Lucene如何控制segments的数量?(4657)
4. javascript的prototype(2519)
5. Java7 VB2008都开始支持Lambda(Closure)了(2349)
评论排行榜
1. 关于Javascript的内存泄漏问题的整理稿(17)
2. 关于google map api中的球平投影算法接口: GProjection和GMercatorProjection类(7)
3. 备忘: UTF-8的格式(3)
4. Lucene如何控制segments的数量?(3)
5. 复杂度为log(n)的排序堆栈算法(2)