2015-03-24 22:51:56 +00:00
|
|
|
# LZ4 Streaming API Basics
|
2015-03-25 16:22:26 +00:00
|
|
|
by *Takayuki Matsuoka*
|
2015-03-24 22:51:56 +00:00
|
|
|
## LZ4 API sets
|
|
|
|
|
|
|
|
LZ4 has the following API sets :
|
|
|
|
|
|
|
|
- "Auto Framing" API (lz4frame.h) :
|
|
|
|
This is most recommended API for usual application.
|
|
|
|
It guarantees interoperability with other LZ4 framing format compliant tools/libraries
|
|
|
|
such as LZ4 command line utility, node-lz4, etc.
|
|
|
|
- "Block" API : This is recommended for simple purpose.
|
|
|
|
It compress single raw memory block to LZ4 memory block and vice versa.
|
|
|
|
- "Streaming" API : This is designed for complex thing.
|
|
|
|
For example, compress huge stream data in restricted memory environment.
|
|
|
|
|
|
|
|
Basically, you should use "Auto Framing" API.
|
|
|
|
But if you want to write advanced application, it's time to use Block or Streaming APIs.
|
|
|
|
|
|
|
|
|
|
|
|
## What is difference between Block and Streaming API ?
|
|
|
|
|
|
|
|
Block API (de)compresses single contiguous memory block.
|
|
|
|
In other words, LZ4 library find redundancy from single contiguous memory block.
|
|
|
|
Streaming API does same thing but (de)compress multiple adjacent contiguous memory block.
|
|
|
|
So LZ4 library could find more redundancy than Block API.
|
|
|
|
|
|
|
|
The following figure shows difference between API and block sizes.
|
|
|
|
In these figures, original data is splitted to 4KiBytes contiguous chunks.
|
|
|
|
|
|
|
|
```
|
|
|
|
Original Data
|
|
|
|
+---------------+---------------+----+----+----+
|
|
|
|
| 4KiB Chunk A | 4KiB Chunk B | C | D |... |
|
|
|
|
+---------------+---------------+----+----+----+
|
|
|
|
|
|
|
|
Example (1) : Block API, 4KiB Block
|
|
|
|
+---------------+---------------+----+----+----+
|
|
|
|
| 4KiB Chunk A | 4KiB Chunk B | C | D |... |
|
|
|
|
+---------------+---------------+----+----+----+
|
|
|
|
| Block #1 | Block #2 | #3 | #4 |... |
|
|
|
|
+---------------+---------------+----+----+----+
|
2016-02-12 22:34:07 +00:00
|
|
|
|
2015-03-24 22:51:56 +00:00
|
|
|
(No Dependency)
|
|
|
|
|
|
|
|
|
|
|
|
Example (2) : Block API, 8KiB Block
|
|
|
|
+---------------+---------------+----+----+----+
|
|
|
|
| 4KiB Chunk A | 4KiB Chunk B | C | D |... |
|
|
|
|
+---------------+---------------+----+----+----+
|
|
|
|
| Block #1 |Block #2 |... |
|
|
|
|
+--------------------+----------+-------+-+----+
|
|
|
|
^ | ^ |
|
|
|
|
| | | |
|
|
|
|
+--------------+ +----+
|
|
|
|
Internal Dependency Internal Dependency
|
|
|
|
|
|
|
|
|
|
|
|
Example (3) : Streaming API, 4KiB Block
|
|
|
|
+---------------+---------------+-----+----+----+
|
|
|
|
| 4KiB Chunk A | 4KiB Chunk B | C | D |... |
|
|
|
|
+---------------+---------------+-----+----+----+
|
|
|
|
| Block #1 | Block #2 | #3 | #4 |... |
|
|
|
|
+---------------+----+----------+-+---+-+--+----+
|
|
|
|
^ | ^ | ^ |
|
|
|
|
| | | | | |
|
|
|
|
+--------------+ +--------+ +---+
|
|
|
|
Dependency Dependency Dependency
|
|
|
|
```
|
|
|
|
|
|
|
|
- In example (1), there is no dependency.
|
|
|
|
All blocks are compressed independently.
|
|
|
|
- In example (2), naturally 8KiBytes block has internal dependency.
|
|
|
|
But still block #1 and #2 are compressed independently.
|
|
|
|
- In example (3), block #2 has dependency to #1,
|
|
|
|
also #3 has dependency to #2 and #1, #4 has #3, #2 and #1, and so on.
|
|
|
|
|
|
|
|
Here, we can observe difference between example (2) and (3).
|
|
|
|
In (2), there's no dependency between chunk B and C, but (3) has dependency between B and C.
|
|
|
|
This dependency improves compression ratio.
|
|
|
|
|
|
|
|
|
|
|
|
## Restriction of Streaming API
|
|
|
|
|
|
|
|
For the efficiency, Streaming API doesn't keep mirror copy of dependent (de)compressed memory.
|
|
|
|
This means users should keep these dependent (de)compressed memory explicitly.
|
|
|
|
Usually, "Dependent memory" is previous adjacent contiguous memory up to 64KiBytes.
|
|
|
|
LZ4 will not access further memories.
|