【问题标题】:How to decompress less than original size with Lz4 library?如何使用 Lz4 库解压缩小于原始大小?
【发布时间】:2018-10-29 21:52:10
【问题描述】:

我正在使用 LZ4 库,并且在解压缩数据时使用:

int LZ4_decompress_fast_continue (void* LZ4_streamDecode, const char* source, char* dest, int originalSize);

我只需要最初编码的N 字节的第一个n 字节,其中n < N。所以为了提高性能,只解压缩原始缓冲区的一部分是有意义的。

我想知道是否可以将n 而不是N 传递给函数的originalSize 参数?

我的初始测试表明,这是不可能的(我得到了错误解压缩的数据)。虽然也许有一种方法,例如如果n 是一些CHUNK_SIZE 的倍数?所有原始 N 字节都通过 1 次压缩函数调用进行压缩。

【问题讨论】:

    标签: c++ compression lz4


    【解决方案1】:

    LZ4_decompress_safe_continue()LZ4_decompress_fast_continue() 只能解码完整块。他们将部分区块视为错误,并将其报告为错误。他们还认为,如果没有足够的空间来解压一个完整的块,这也是一个错误。

    您正在寻找的功能尚不存在。但有一位近亲可能会有所帮助。

    LZ4_decompress_safe_partial() 可以解码块的一部分。 请注意,与_continue() 变体相比,它仅适用于独立块。 还要注意,压缩块必须是完整的,并且输出缓冲区必须有足够的空间来解码整个块。所以这个函数提供的唯一优势是速度:如果你只想要前 10 个字节,它会在生成足够的字节后立即停止。

    “尽快”并不意味着“正好在 10 点”。可能要晚得多,在最坏的情况下,可能是在解码整个块之后。这是因为内部解码引擎仍然是相同的:它解码整个序列,并且不会在中间“破坏”它们,以考虑速度。

    如果您需要提取比完整块更少的字节以节省一些内存,恐怕还没有解决方案。将其作为功能请求报告给上游。

    【讨论】:

      【解决方案2】:

      这似乎已经在 lz4 1.8.3 中实现了。

      【讨论】:

        猜你喜欢
        • 2014-11-02
        • 2016-05-01
        • 1970-01-01
        • 1970-01-01
        • 2016-03-31
        • 1970-01-01
        • 2017-12-14
        • 1970-01-01
        相关资源
        最近更新 更多