feat: 9.5.9
This commit is contained in:
parent
cb1753732b
commit
35f43a7909
1084 changed files with 558985 additions and 0 deletions
67
lz4/examples/dictionaryRandomAccess.md
Normal file
67
lz4/examples/dictionaryRandomAccess.md
Normal file
|
|
@ -0,0 +1,67 @@
|
|||
# LZ4 API Example : Dictionary Random Access
|
||||
|
||||
`dictionaryRandomAccess.c` is LZ4 API example which implements dictionary compression and random access decompression.
|
||||
|
||||
Please note that the output file is not compatible with lz4frame and is platform dependent.
|
||||
|
||||
|
||||
## What's the point of this example ?
|
||||
|
||||
- Dictionary based compression for homogenous files.
|
||||
- Random access to compressed blocks.
|
||||
|
||||
|
||||
## How the compression works
|
||||
|
||||
Reads the dictionary from a file, and uses it as the history for each block.
|
||||
This allows each block to be independent, but maintains compression ratio.
|
||||
|
||||
```
|
||||
Dictionary
|
||||
+
|
||||
|
|
||||
v
|
||||
+---------+
|
||||
| Block#1 |
|
||||
+----+----+
|
||||
|
|
||||
v
|
||||
{Out#1}
|
||||
|
||||
|
||||
Dictionary
|
||||
+
|
||||
|
|
||||
v
|
||||
+---------+
|
||||
| Block#2 |
|
||||
+----+----+
|
||||
|
|
||||
v
|
||||
{Out#2}
|
||||
```
|
||||
|
||||
After writing the magic bytes `TEST` and then the compressed blocks, write out the jump table.
|
||||
The last 4 bytes is an integer containing the number of blocks in the stream.
|
||||
If there are `N` blocks, then just before the last 4 bytes is `N + 1` 4 byte integers containing the offsets at the beginning and end of each block.
|
||||
Let `Offset#K` be the total number of bytes written after writing out `Block#K` *including* the magic bytes for simplicity.
|
||||
|
||||
```
|
||||
+------+---------+ +---------+---+----------+ +----------+-----+
|
||||
| TEST | Block#1 | ... | Block#N | 4 | Offset#1 | ... | Offset#N | N+1 |
|
||||
+------+---------+ +---------+---+----------+ +----------+-----+
|
||||
```
|
||||
|
||||
## How the decompression works
|
||||
|
||||
Decompression will do reverse order.
|
||||
|
||||
- Seek to the last 4 bytes of the file and read the number of offsets.
|
||||
- Read each offset into an array.
|
||||
- Seek to the first block containing data we want to read.
|
||||
We know where to look because we know each block contains a fixed amount of uncompressed data, except possibly the last.
|
||||
- Decompress it and write what data we need from it to the file.
|
||||
- Read the next block.
|
||||
- Decompress it and write that page to the file.
|
||||
|
||||
Continue these procedure until all the required data has been read.
|
||||
Reference in a new issue