这可能落在该领域"不是真的可行"或"不是真正值得的努力,"但这里去。

我想随机访问记录内部保存的多部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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top