【问题标题】:How can I tail a zipped file without reading its entire contents?如何在不阅读其全部内容的情况下跟踪压缩文件?
【发布时间】:2009-07-25 20:39:59
【问题描述】:

我想模拟 gzcat 的功能 |尾 -n。

当文件很大(几 GB 左右)时,这会很有帮助。我可以不从头开始读取此类文件的最后几行吗?我怀疑这是不可能的,因为我猜是 gzip,编码将取决于之前的所有文本。

但我仍然想知道是否有人尝试过类似的操作 - 可能正在研究可以提供此类功能的压缩算法。

【问题讨论】:

标签: algorithm compression


【解决方案1】:

不,你不能。 zipping algorithm 作用于流,并根据流包含的内容调整其内部编码,以实现其高压缩率。

如果不知道某个点之前流的内容是什么,就不可能知道如何从该点开始解压缩。

任何允许您解压缩任意部分的算法都需要对数据进行多次传递才能对其进行压缩。

【讨论】:

  • 这只是部分正确,具体取决于文件的构造方式。 gzip 文件可以包含多个流,后一个流完全独立于前一个流。您可以将 gzip 文件连接在一起,并且仍然有一个有效的 gzip 文件。我不知道细节,但我认为有可能找到流的最后一次此类重置的位置,假设写入流的任何内容都非常频繁地重新启动。
【解决方案2】:

BGZF 用于创建由 Samtools 创建的索引 gzip 压缩 BAM 文件。这些是随机访问的。

http://samtools.sourceforge.net/

【讨论】:

  • 没错。但是,它不仅适用于 samtools 或 BAM!我相信它适用于任何以行分隔的数据。
  • BGZF 文件允许访问特殊构造的 gzip 中的随机字节偏移,方法是首先限制块大小,然后将每个块的长度存储在 BC 标头(gzip 忽略)中以允许随机访问而无需解压缩. BAM 等工具通过存储块开始的偏移量以及块内的偏移量来存储偏移量。要获得面向行的索引,您需要诸如随附的 bai 或 tabix 文件(尽管这些文件是特定于格式和基因组的)来从您想要的行映射到偏移量。
  • bgzip是使用 BGZF 算法进行压缩的工具,正如已经说过的,它与 gzip 完全兼容。我开发了一个工具来跟踪任何 bgzip 文件:bgztail (github.com/circulosmeos/bgztail),即使它仍在增长。
【解决方案3】:

如果您首先可以控制文件中的内容,如果它类似于 ZIP 文件,您可以存储预定大小的块,文件名按数字顺序递增,然后只需解压缩最后一个块/文件。

【讨论】:

  • 这听起来是个不错的折衷方案。但是,OP 应该知道这会降低压缩比。如果测试表明比率变化是可以接受的,这是个好主意。
  • 您实际上可以通过在文件的中途重置压缩字典来实现这一点,从而无需将文件本身拆分为块。
【解决方案4】:

如果可以选择,那么 bzip2 可能是用于此目的的更好的压缩算法。

Bzip2 使用块压缩方案。因此,如果您确定文件末尾的一块大到足以包含最后一个块,那么您可以使用 bzip2recover 恢复它。

在写入文件时可选择块大小。事实上,当您将 -1(或 --fast)设置为 -9(或 --best)作为压缩选项时会发生这种情况,这对应于 100k 到 900k 的块大小。默认为 900k。

bzip2 命令行工具并没有为您提供使用管道执行此操作的友好方式,但鉴于 bzip2 不是面向流的,这也许不足为奇。

【讨论】:

    【解决方案5】:

    zindex 以节省时间和空间的方式在压缩的、基于行的文本文件上创建和查询索引。

    https://github.com/mattgodbolt/zindex

    【讨论】:

      【解决方案6】:

      完全兼容 gzip 的伪随机访问格式的示例是 dictzip

      为了压缩,文件被分成数据“块”,每个 块小于 64kB。 [...]

      要对数据执行随机访问,偏移量和长度 数据提供给库例程。这些例程决定了 所需数据开始的块,并解压缩该块。 连续的块会根据需要进行解压。”

      【讨论】:

        【解决方案7】:

        好吧,你可以这样做,如果你之前为每个文件创建一个索引 ...

        我开发了一个命令行工具,它为 gzip 文件创建索引,允许在其中进行非常快速的随机访问,并且它与操作(提取、尾部、连续尾部等)交错执行): https://github.com/circulosmeos/gztool

        但是你可以做一个tail (-t),并且索引会自动创建:如果你以后要做同样的事情,它会更快,而且无论如何第一次它会花费与gunzip | tail 同一时间:

        $ gztool -t my_file.gz
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-04-21
          相关资源
          最近更新 更多