【问题标题】:Multi-part gzip file random access (in Java)多部分 gzip 文件随机访问(Java 中)
【发布时间】:2010-11-16 13:23:40
【问题描述】:

这可能属于“不太可行”或“不值得付出努力”的范畴,但在这里。

我正在尝试随机访问存储在多部分 gzip 文件中的记录。具体来说,我感兴趣的文件是压缩的Heretrix Arc 文件。 (如果您不熟悉多部分 gzip 文件,gzip 规范允许将多个 gzip 流连接到一个 gzip 文件中。它们不共享任何字典信息,它是简单的二进制附加。)

我认为应该可以通过寻找文件中的某个偏移量来做到这一点,然后扫描 gzip 魔术头字节(即 0x1f8b,根据RFC),并尝试读取 gzip从以下字节流。这种方法的问题是这些相同的字节也可能出现在实际数据中,因此寻找这些字节可能会导致开始读取 gzip 流的无效位置。鉴于记录偏移量是先验未知的,是否有更好的方法来处理随机访问?

【问题讨论】:

    标签: compression gzip multipart random-access


    【解决方案1】:

    与GZIP兼容的BGZF文件格式由生物学家开发。

    (...) 的优点 BGZF 优于传统 gzip 是 BGZF 允许寻找而无需 扫描整个文件直到 正在寻找的职位。

    http://picard.svn.sourceforge.net/viewvc/picard/trunk/src/java/net/sf/samtools/util/ 中,查看 BlockCompressedOutputStream 和 BlockCompressedInputStream.java

    【讨论】:

      【解决方案2】:

      如您所见,GZIP 的设计对随机访问并不友好。

      您可以按照您的描述进行操作,然后如果您在解压缩器中遇到错误,则断定您找到的签名实际上是压缩数据。
      如果解压完成,那么通过CRC32就很容易验证刚刚解压的流的有效性。

      如果文件不是很大,你可以考虑把所有的条目依次解压,保留签名的偏移量,建立一个目录。解压缩时,将字节转储到位桶。此时您将生成一个目录,然后您可以支持基于文件名、日期或其他元数据的随机访问。

      对于 100k 以下的文件,这将是相当快的。就像猜测一样,如果您有 10 个文件,每个文件大约 100k,那么在现代 CPU 上可能会在 2 秒内完成。这就是我所说的“相当快”。但只有您知道您的应用程序的性能要求。

      你有 GZipInputStream 类吗?如果是这样,您就成功了一半。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-09-17
        • 1970-01-01
        • 2019-01-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多