多部分gzip文件随机访问(Java)

时间:2009-08-04 01:32:42

标签: compression gzip multipart random-access

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

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

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

2 个答案:

答案 0 :(得分:3)

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

  

(...)的优势   BGZF胜过传统的gzip就是这样   BGZF允许在没有的情况下进行搜索   扫描整个文件到   正在寻找的位置。

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

答案 1 :(得分:1)

正如您所意识到的,GZIP的设计对随机访问并不友好。

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

如果文件不是那么大,您可能会考虑只对系列中的所有条目进行解压缩,并保留签名的偏移量以构建目录。解压缩时,将字节转储到位桶。此时,您将生成一个目录,然后您可以根据文件名,日期或其他元数据支持随机访问。

对于低于100k的文件,这将相当快。就像一个猜测,如果你有10个文件,每个大约100k,它可能会在现代CPU上以2s完成。这就是我所说的“非常快”。但只有您了解应用程序的性能要求。

你有GZipInputStream类吗?如果是这样,你就在中途。