diff --git a/doc/zstd_manual.html b/doc/zstd_manual.html index bd792008..e168fa2e 100644 --- a/doc/zstd_manual.html +++ b/doc/zstd_manual.html @@ -181,7 +181,8 @@ size_t ZSTD_freeDCtx(ZSTD_DCtx* dctx);
When compressing multiple messages / blocks with the same dictionary, it's recommended to load it just once. ZSTD_createCDict() will create a digested dictionary, ready to start future compression operations without startup delay. ZSTD_CDict can be created once and shared by multiple threads concurrently, since its usage is read-only. - `dictBuffer` can be released after ZSTD_CDict creation, since its content is copied within CDict + `dictBuffer` can be released after ZSTD_CDict creation, since its content is copied within CDict + Note : A ZSTD_CDict can be created with an empty dictionary, but it is inefficient for small data.
size_t ZSTD_freeCDict(ZSTD_CDict* CDict); @@ -195,7 +196,9 @@ size_t ZSTD_freeDCtx(ZSTD_DCtx* dctx);Compression using a digested Dictionary. Faster startup than ZSTD_compress_usingDict(), recommended when same dictionary is used multiple times. Note that compression level is decided during dictionary creation. - Frame parameters are hardcoded (dictID=yes, contentSize=yes, checksum=no) + Frame parameters are hardcoded (dictID=yes, contentSize=yes, checksum=no) + Note : ZSTD_compress_usingCDict() can be used with a ZSTD_CDict created from an empty dictionary. + But it is inefficient for small data, and it is recommended to use ZSTD_compressCCtx().
ZSTD_DDict* ZSTD_createDDict(const void* dictBuffer, size_t dictSize); diff --git a/lib/decompress/zstd_decompress.c b/lib/decompress/zstd_decompress.c index e71e961f..0f02540f 100644 --- a/lib/decompress/zstd_decompress.c +++ b/lib/decompress/zstd_decompress.c @@ -1039,7 +1039,8 @@ size_t ZSTD_decodeSeqHeaders(ZSTD_DCtx* dctx, int* nbSeqPtr, /* prefetch dictionary content */ if (dctx->ddictIsCold) { size_t const dictSize = (const char*)dctx->prefixStart - (const char*)dctx->virtualStart; - size_t const pSize = MIN(dictSize, (size_t)(64*nbSeq)); + size_t const psmin = MIN(dictSize, (size_t)(64*nbSeq) /* heuristic */ ); + size_t const pSize = MIN(psmin, 128 KB /* protection */ ); const void* const pStart = (const char*)dctx->dictEnd - pSize; PREFETCH_AREA(pStart, pSize); dctx->ddictIsCold = 0;