mirror of
https://github.com/adamhathcock/sharpcompress.git
synced 2026-07-08 18:16:30 +00:00
Revert default buffer to 80KB; add ZStandard minimumRewindBufferSize (DStreamInSize=131075)
Agent-Logs-Url: https://github.com/adamhathcock/sharpcompress/sessions/d5a696df-2906-4262-acf9-06cc174e91fc Co-authored-by: adamhathcock <527620+adamhathcock@users.noreply.github.com>
This commit is contained in:
committed by
GitHub
parent
d278cfbf4f
commit
456a7dfd58
@@ -22,9 +22,11 @@ public static class Constants
|
||||
/// by rewinding and re-reading the same data.
|
||||
/// </para>
|
||||
/// <para>
|
||||
/// <b>Default:</b> 163840 bytes (160KB) - sized to cover ZStandard's worst-case
|
||||
/// first block on a tar archive (~131KB including frame header overhead).
|
||||
/// ZStandard blocks can be up to 128KB, exceeding the previous 81KB default.
|
||||
/// <b>Default:</b> 81920 bytes (80KB) — sufficient for most formats.
|
||||
/// Formats that require larger buffers (e.g. BZip2, ZStandard) declare their
|
||||
/// own minimum via <c>TarWrapper.MinimumRewindBufferSize</c>, and
|
||||
/// <c>TarWrapper.MaximumRewindBufferSize</c> is used at stream construction
|
||||
/// to ensure the correct capacity is allocated upfront.
|
||||
/// </para>
|
||||
/// <para>
|
||||
/// <b>Typical usage:</b> 500-1000 bytes for most archives
|
||||
@@ -41,7 +43,7 @@ public static class Constants
|
||||
/// </list>
|
||||
/// </para>
|
||||
/// </remarks>
|
||||
public static int RewindableBufferSize { get; set; } = 163840;
|
||||
public static int RewindableBufferSize { get; set; } = 81920;
|
||||
|
||||
public static CultureInfo DefaultCultureInfo { get; set; } = CultureInfo.InvariantCulture;
|
||||
}
|
||||
|
||||
@@ -6,4 +6,17 @@ internal class ZstandardConstants
|
||||
/// Magic number found at start of ZStandard frame: 0xFD 0x2F 0xB5 0x28
|
||||
/// </summary>
|
||||
public const uint MAGIC = 0xFD2FB528;
|
||||
|
||||
/// <summary>
|
||||
/// Maximum uncompressed size of a single ZStandard block: ZSTD_BLOCKSIZE_MAX = 128 KB.
|
||||
/// </summary>
|
||||
public const int BlockSizeMax = 1 << 17; // 131072 bytes
|
||||
|
||||
/// <summary>
|
||||
/// Recommended input (compressed) buffer size for streaming decompression:
|
||||
/// ZSTD_DStreamInSize = ZSTD_BLOCKSIZE_MAX + ZSTD_blockHeaderSize (3 bytes).
|
||||
/// The ring buffer must be at least this large to hold the compressed bytes read
|
||||
/// during format detection before the first rewind.
|
||||
/// </summary>
|
||||
public const int DStreamInSize = BlockSizeMax + 3;
|
||||
}
|
||||
|
||||
@@ -88,7 +88,11 @@ public class TarWrapper(
|
||||
ZStandardStream.IsZStandardAsync,
|
||||
(stream) => new ZStandardStream(stream),
|
||||
(stream, _) => new ValueTask<Stream>(new ZStandardStream(stream)),
|
||||
["tar.zst", "tar.zstd", "tzst", "tzstd"]
|
||||
["tar.zst", "tar.zstd", "tzst", "tzstd"],
|
||||
// ZStandard decompresses in blocks; the compressed size of the first block
|
||||
// can be up to ZSTD_BLOCKSIZE_MAX + ZSTD_blockHeaderSize = 131075 bytes.
|
||||
// The ring buffer must hold all compressed bytes read during format detection.
|
||||
minimumRewindBufferSize: ZstandardConstants.DStreamInSize
|
||||
),
|
||||
new(
|
||||
CompressionType.LZip,
|
||||
|
||||
Reference in New Issue
Block a user