zstd/contrib/seekable_format
Victor Zhang a610550e2c
Merge pull request #4218 from facebook/externC
Move #includes out of `extern "C"` blocks
2025-01-07 10:06:08 -08:00
..
examples Do not test WIN32, instead test _WIN32 2023-09-23 19:03:18 +02:00
tests seekable_format: Add unit test for multiple decompress calls 2023-03-29 21:35:52 -07:00
README.md added documentation for the seekable format 2023-03-10 15:54:31 -08:00
zstd_seekable.h Move #includes out of extern "C" blocks 2024-12-17 17:55:07 -08:00
zstd_seekable_compression_format.md Coalesce Almost All Copyright Notices to Standard Phrasing 2022-12-20 12:52:34 -05:00
zstdseek_compress.c Improved seekable format ingestion speed for small frame size 2023-03-09 18:00:30 -08:00
zstdseek_decompress.c PR feedback 2025-01-02 15:05:58 -08:00

Zstandard Seekable Format

The seekable format splits compressed data into a series of independent "frames", each compressed individually, so that decompression of a section in the middle of an archive only requires zstd to decompress at most a frame's worth of extra data, instead of the entire archive.

The frames are appended, so that the decompression of the entire payload still regenerates the original content, using any compliant zstd decoder.

On top of that, the seekable format generates a jump table, which makes it possible to jump directly to the position of the relevant frame when requesting only a segment of the data. The jump table is simply ignored by zstd decoders unaware of the seekable format.

The format is delivered with an API to create seekable archives and to retrieve arbitrary segments inside the archive.

Maximum Frame Size parameter

When creating a seekable archive, the main parameter is the maximum frame size.

At compression time, user can manually select the boundaries between segments, but they don't have to: long segments will be automatically split when larger than selected maximum frame size.

Small frame sizes reduce decompression cost when requesting small segments, because the decoder will nonetheless have to decompress an entire frame to recover just a single byte from it.

A good rule of thumb is to select a maximum frame size roughly equivalent to the access pattern when it's known. For example, if the application tends to request 4KB blocks, then it's a good idea to set a maximum frame size in the vicinity of 4 KB.

But small frame sizes also reduce compression ratio, and increase the cost for the jump table, so there is a balance to find.

In general, try to avoid really tiny frame sizes (<1 KB), which would have a large negative impact on compression ratio.