Copyright | (c) 2016-present Facebook Inc. All rights reserved. |
---|---|
License | BSD3 |
Maintainer | bryano@fb.com |
Stability | experimental |
Portability | GHC |
Safe Haskell | None |
Language | Haskell2010 |
These functions allow for pre-allocation and reuse of relatively expensive data structures, such as compression and decompression contexts and dictionaries.
If your application mostly deals with small payloads and is particularly sensitive to latency or throughput, using these pre-allocated structures may make a noticeable difference to performance.
Synopsis
- data Decompress
- decompressedSize :: ByteString -> Maybe Int
- maxCLevel :: Int
- data CCtx
- withCCtx :: (CCtx -> IO a) -> IO a
- compressCCtx :: CCtx -> Int -> ByteString -> IO ByteString
- data DCtx
- withDCtx :: (DCtx -> IO a) -> IO a
- decompressDCtx :: DCtx -> ByteString -> IO Decompress
- data Dict
- mkDict :: ByteString -> Dict
- fromDict :: Dict -> ByteString
- trainFromSamples :: Int -> [ByteString] -> Either String Dict
- getDictID :: Dict -> Maybe Word
- compressUsingDict :: Dict -> Int -> ByteString -> ByteString
- decompressUsingDict :: Dict -> ByteString -> Decompress
- data CDict
- createCDict :: Int -> Dict -> CDict
- compressUsingCDict :: CCtx -> CDict -> ByteString -> IO ByteString
- data DDict
- createDDict :: Dict -> DDict
- decompressUsingDDict :: DCtx -> DDict -> ByteString -> IO Decompress
Basic entry points
data Decompress Source #
The result of a decompression operation.
Skip | Either the compressed frame was empty, or it was compressed in streaming mode and so its size is not known. |
Error String | An error occurred. |
Decompress ByteString | The payload was successfully decompressed. |
Instances
Eq Decompress Source # | |
Defined in Codec.Compression.Zstd.Types (==) :: Decompress -> Decompress -> Bool # (/=) :: Decompress -> Decompress -> Bool # | |
Read Decompress Source # | |
Defined in Codec.Compression.Zstd.Types readsPrec :: Int -> ReadS Decompress # readList :: ReadS [Decompress] # readPrec :: ReadPrec Decompress # readListPrec :: ReadPrec [Decompress] # | |
Show Decompress Source # | |
Defined in Codec.Compression.Zstd.Types showsPrec :: Int -> Decompress -> ShowS # show :: Decompress -> String # showList :: [Decompress] -> ShowS # |
decompressedSize :: ByteString -> Maybe Int Source #
Return the decompressed size of a compressed payload, as stored in the payload's header.
The returned value will be Nothing
if it is either not known
(probably because the payload was compressed using a streaming
API), empty, or too large to fit in an Int
.
Note: this value should not be trusted, as it can be controlled by an attacker.
Cheaper operations using contexts
Compression
withCCtx :: (CCtx -> IO a) -> IO a Source #
Allocate a compression context, run an action that may reuse the context as many times as it needs, then free the context.
:: CCtx | Compression context. |
-> Int | Compression level. Must be >= 1 and <= |
-> ByteString | Payload to compress. |
-> IO ByteString |
Compress the given data as a single zstd compressed frame.
Decompression
withDCtx :: (DCtx -> IO a) -> IO a Source #
Allocate a decompression context, run an action that may reuse the context as many times as it needs, then free the context.
:: DCtx | Decompression context. |
-> ByteString | Compressed payload. |
-> IO Decompress |
Decompress a single-frame payload of known size. Typically this
will be a payload that was compressed with compress
.
Note: This function is not capable of decompressing a payload generated by the streaming or lazy compression APIs.
Dictionary-based compression
Compression dictionary.
mkDict :: ByteString -> Dict Source #
Smart constructor.
fromDict :: Dict -> ByteString Source #
:: Int | Maximum size of the compression dictionary to create. The actual dictionary returned may be smaller. |
-> [ByteString] | Samples to train with. |
-> Either String Dict |
Create and train a compression dictionary from a collection of samples.
To create a well-trained dictionary, here are some useful guidelines to keep in mind:
- A reasonable dictionary size is in the region of 100 KB. (Trying to specify a dictionary size of less than a few hundred bytes will probably fail.)
- To train the dictionary well, it is best to supply a few thousand training samples.
- The combined size of all training samples should be 100 or more times larger than the size of the dictionary.
getDictID :: Dict -> Maybe Word Source #
Return the identifier for the given dictionary, or Nothing
if
not a valid dictionary.
Basic pure API
:: Dict | Compression dictionary. |
-> Int | Compression level. Must be >= 1 and <= |
-> ByteString | Payload to compress. |
-> ByteString |
Compress the given data as a single zstd compressed frame, using a prebuilt dictionary.
:: Dict | Dictionary. |
-> ByteString | Payload to decompress. |
-> Decompress |
Decompress a single-frame payload of known size, using a prebuilt
dictionary. Typically this will be a payload that was compressed
with compressUsingDict
.
Note: This function is not capable of decompressing a payload generated by the streaming or lazy compression APIs.
Pre-digested dictionaries
Create a pre-digested compression dictionary.
:: CCtx | Compression context. |
-> CDict | Compression dictionary. |
-> ByteString | Payload to compress. |
-> IO ByteString |
Compress the given data as a single zstd compressed frame, using a pre-built, pre-digested dictionary.
:: DCtx | Decompression context. |
-> DDict | Decompression dictionary. |
-> ByteString | Payload to compress. |
-> IO Decompress |
Decompress a single-frame payload of known size, using a
pre-built, pre-digested dictionary. Typically this will be a
payload that was compressed with compressUsingCDict
.
Note: This function is not capable of decompressing a payload generated by the streaming or lazy compression APIs.