多部分gzip文件中随机访问(在Java)
-
22-07-2019 - |
题
这可能落在该领域"不是真的可行"或"不是真正值得的努力,"但这里去。
我想随机访问记录内部保存的多部gzip文件。具体地说,该文件,我感兴趣的是压缩 Heretrix 弧文件。(如果你不熟悉的多部分gzip文件,gzip规格允许多个gzip流串联在一个单一的gzip文件。他们不分享任何词典的信息,这是简单的二元追加。)
我想应该可以做到这一点通过寻求一定的偏移内的文件,然后扫描gzip魔头字节(即0x1f8b,作为每 RFC),并试图读gzip流,从以下字节。这种方法的问题是,这些同样的字节的可能内出现的实际数据,所以寻求对这些字节可能导致无效的位置开始读一gzip流。是否有更好的办法来处理随机访问,鉴于该记录偏不是先验地知道?
解决方案
GZIP的设计,因为你已经意识到,是不是友好的随机访问。
您可以做你的描述,然后如果你碰上解压错误,得出结论,你发现签名实际上是压缩数据。结果 如果你完成解压缩,然后可以很容易地验证刚刚解压缩流的有效性,通过CRC32。
如果文件是没有这么大,你可以考虑刚去压缩所有条目串联,并保留签名的偏移量,从而建立一个目录。当你解压缩,自卸字节到位桶。在这一点上你会产生目录,然后你可以根据文件名,日期,或其他元数据支持随机访问。
这将是相当快的下面100k的文件。正如猜测,如果你有每个100k左右的10个文件,它可能会在2秒做一个现代的CPU上。这就是我所说的“相当快”。但是,只有你知道你的应用程序的PERF要求。
你有GZipInputStream类?如果是这样,你有没有中途。
其他提示
的 BGZF 文件格式,GZIP兼容由生物学家developped。
(...)的优点 BGZF比传统的gzip的是, BGZF允许寻求无需 整个文件长达扫描 所寻求的位置。
在 HTTP:/ /picard.svn.sourceforge.net/viewvc/picard/trunk/src/java/net/sf/samtools/util/ ,看看BlockCompressedOutputStream和BlockCompressedInputStream.java