gpt4 book ai didi

java - 使用 Java append 到压缩流

转载 作者:太空宇宙 更新时间:2023-11-04 13:50:30 25 4
gpt4 key购买 nike

我们目前有一些数据日志。该日志是仅追加的,但在每次追加时,都会从头开始扫描整个日志以进行一些一致性检查(某些事件组合会触发警报)。

现在,我们想要将该日志转换为压缩日志。单个日志条目通常有几十个字节,因此它们不能很好地压缩。然而,整个日志流确实压缩得很好,存在足够的冗余。

理论上, append 到压缩流应该很容易,因为可以在扫描(和解压缩)日志时重建压缩编码器的状态。

我们当前的方法是在扫描和解压缩阶段运行具有相同设置的压缩器,向其提供刚刚解压缩的数据(假设它将构建相同的状态)。

但是,我们知道这并不是最佳选择。我们希望重用解压缩期间构建的状态来压缩新数据。所以问题是:我们如何实现(解)压缩,不需要将解压缩的数据提供给压缩器来构建状态,而是可以重新使用解压缩器的状态来压缩我们 append 的新数据?

(不幸的是,我们需要在 java 中执行此操作,这限制了可用 API 的数量。不过,包含免费/开源第 3 方代码是一种选择。)

最佳答案

您可能没有 Java 中所需的接口(interface),但这可以通过 zlib 来完成。您可以将自己的 Java 接口(interface)编写到 zlib 来执行此操作。

扫描时,您将使用队列保留最后 32K 未压缩数据。您可以使用 inflate() 中的 Z_BLOCK 扫描压缩文件。这将在每个放气 block 处停止。当到达最后一个 block (由 block 的第一位标识)时,您将保存该 block 的未压缩数据,以及您在队列中保存的前面的 32K 数据。您还可以保存前一个 block 中未完成字节的最后位(0..7 位)。然后,您可以将新的日志条目添加到最后一 block 未压缩数据中,然后使用前面的 32K 和 deflateSetDictionary() 重新压缩该部分。您可以使用 deflatePrime() 在位边界上开始压缩。这将用新的压缩 block 覆盖最后一个压缩 block 。

关于java - 使用 Java append 到压缩流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30341960/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com