Skip to content

Commit b48145a

Browse files
committed
update
1 parent 258fcfc commit b48145a

File tree

5 files changed

+41
-26
lines changed

5 files changed

+41
-26
lines changed

Diff for: README.md

+24-10
Original file line numberDiff line numberDiff line change
@@ -1,34 +1,48 @@
11
# simple8b的Go实现
22

3+
# 一、simple8b压缩原理详解
34

5+
simple8b是一个整数压缩算法,用于将多个**小整数**压缩到一个 64bit长整型中存储。
46

5-
Simple8b 是 64 位算法,维护了一个查找表,实现将多个整形数据压缩到一个 64bit 长整型中。其中前 4 位表示选择器,用来标记每个值使用多少bit,后面 60 位用于存储数据。 ![simple8b算法查找表](./README.assets/data_compress_4-8b1ba456.png) 如上图所示,Integers Coded表示可压缩的数据集大小,Bits Per Integer表示每个整数分配多少 Bits 来表示,比如要压缩8个数据,选择器选择8,每个数据用7个 bits 表示,但是如果某个数据的值超过了7个 bits 的表示范围,那么就需要尝试用选择器9,只能压缩前7个数据,每个数据用8个bits来表示,以此类推。第一次未压缩的数据将压缩到一个新的64bit的长整型中,由此可见simple8b算法对小整数的压缩效果比较好,对大整数的压缩效果不佳。
6-
7-
8-
9-
一个int64类型有64位:
7+
正常情况下一个int64类型有64个bit,在内存中的存储格式类似于下面这样,其中每个格子表示一个bit:
108

119
![](.README_images/21beabb6.png)
1210

13-
每8个bit分为一组用同一个颜色标识,这样看得更清楚一些,每个不同的颜色是一个byte,总共是8个byte 64个bit
11+
上面这个看上去不是很直观,于是我们对每8个bit分为一组表示一个byte,用同一个颜色标识,这样看得更清楚一些,每个不同的颜色是一个byte,8个byte总共64个bit格子
1412

1513
![](./README.assets/55a2e7d1.png)
1614

17-
其中前4个bit用来存放数值位数长度
15+
而simple8b就是对这64个bit的布局重新做了划分,将其分为两部分,其中前4个bit用来指定后面的bit里存储数值时的位数长度
1816

1917
![](./README.assets/e598a60d.png)
2018

21-
比如每个数值使用4个bit来表示
19+
比如如果指定每个数值使用4个bit来表示,则后面的bit每4个为一组存储一个整数,还能存储15个整数
2220

2321
![](.README_images/25ad07ef.png)
2422

25-
每个数值使用10个bit来表示
23+
比如如果指定每个整数使用10个bit来表示,则后面的bit是每10个bit一组,则能够存储6个整数
2624

2725
![](.README_images/03e5b34a.png)
2826

29-
每个数值使用15个bit来表示
27+
比如如果指定每个整数使用15个bit来表示,则后面的bit是每15个一组,则能够存储4个整数
3028

3129
![](.README_images/64320512.png)
3230

3331

3432

33+
34+
35+
36+
37+
其中前 4 位表示选择器,用来标记每个值使用多少bit,后面 60 位用于存储数据。 ![simple8b算法查找表](./README.assets/data_compress_4-8b1ba456.png) 如上图所示,Integers Coded表示可压缩的数据集大小,Bits Per Integer表示每个整数分配多少 Bits 来表示,比如要压缩8个数据,选择器选择8,每个数据用7个 bits 表示,但是如果某个数据的值超过了7个 bits 的表示范围,那么就需要尝试用选择器9,只能压缩前7个数据,每个数据用8个bits来表示,以此类推。第一次未压缩的数据将压缩到一个新的64bit的长整型中,由此可见simple8b算法对小整数的压缩效果比较好,对大整数的压缩效果不佳。
38+
39+
40+
41+
# 二、安装使用
42+
43+
```bash
44+
go get -u github.com/compression-algorithm-research-lab/go-simple8b
45+
```
46+
47+
48+

Diff for: docs/.$simple8b.drawio.bkp

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
<mxfile host="Electron" modified="2024-12-02T17:38:24.775Z" agent="Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) draw.io/24.6.4 Chrome/124.0.6367.207 Electron/30.0.6 Safari/537.36" etag="PW4D4GI-SpaZj9tOcr30" version="24.6.4" type="device" pages="3">
1+
<mxfile host="Electron" modified="2024-12-02T17:51:03.849Z" agent="Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) draw.io/24.6.4 Chrome/124.0.6367.207 Electron/30.0.6 Safari/537.36" etag="ReQ0iqIJdK3M7j5hRspX" version="24.6.4" type="device" pages="3">
22
<diagram name="int64" id="02SRVaNnKwjdRZSloUX8">
33
<mxGraphModel dx="2674" dy="1580" grid="0" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="1169" pageHeight="827" math="0" shadow="0">
44
<root>

Diff for: docs/simple8b.drawio

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
<mxfile host="Electron" modified="2024-12-02T17:38:41.161Z" agent="Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) draw.io/24.6.4 Chrome/124.0.6367.207 Electron/30.0.6 Safari/537.36" etag="S_c4m-mKiy6g5RBIPEtm" version="24.6.4" type="device" pages="3">
1+
<mxfile host="Electron" modified="2024-12-02T17:51:04.024Z" agent="Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) draw.io/24.6.4 Chrome/124.0.6367.207 Electron/30.0.6 Safari/537.36" etag="rjuTKuTX_2bTd5ZyKcl0" version="24.6.4" type="device" pages="3">
22
<diagram name="int64" id="02SRVaNnKwjdRZSloUX8">
33
<mxGraphModel dx="2674" dy="1580" grid="0" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="1169" pageHeight="827" math="0" shadow="0">
44
<root>

Diff for: mode.go

+8-7
Original file line numberDiff line numberDiff line change
@@ -36,19 +36,20 @@ const (
3636

3737
// WhichMode 判断给定的无符号整数适合用哪种压缩模式
3838
func WhichMode[T gtypes.Unsigned](value T) Mode {
39-
if value <= 1 {
39+
v := int64(value)
40+
if v <= 1 {
4041
return Mode0BitPacking1
41-
} else if value <= 15 {
42+
} else if v <= 15 {
4243
return Mode1BitPacking4
43-
} else if value <= 255 {
44+
} else if v <= 255 {
4445
return Mode2BitPacking8
45-
} else if value <= 4095 {
46+
} else if v <= 4095 {
4647
return Mode3BitPacking12
47-
} else if value <= 65535 {
48+
} else if v <= 65535 {
4849
return Mode4BitPacking16
49-
} else if value <= 1048575 {
50+
} else if v <= 1048575 {
5051
return Mode5BitPacking20
51-
} else if value <= 16777215 {
52+
} else if v <= 16777215 {
5253
return Mode6BitPacking24
5354
} else {
5455
return Mode7DirectMode

Diff for: simple8b.go

+7-7
Original file line numberDiff line numberDiff line change
@@ -62,10 +62,10 @@ func DecodeE[T gtypes.Integer](bytes []byte) ([]T, error) {
6262
return result, nil
6363
}
6464

65-
func EncodeToBytes[T gtypes.Integer](slice []T) []byte {
66-
67-
}
68-
69-
func DecodeFromBytes[T gtypes.Integer](bytes []byte) ([]T, error) {
70-
71-
}
65+
//func EncodeToBytes[T gtypes.Integer](slice []T) []byte {
66+
//
67+
//}
68+
//
69+
//func DecodeFromBytes[T gtypes.Integer](bytes []byte) ([]T, error) {
70+
//
71+
//}

0 commit comments

Comments
 (0)