【问题标题】:How to modify a gzip compressed file如何修改gzip压缩文件
【发布时间】:2014-01-26 18:13:51
【问题描述】:

我有一个 gzip 压缩文件(100GB 未压缩 40GB 压缩)。现在我想修改一些字节/字节范围 - 我不想更改文件大小。

例如 字节 8 + 10 和字节 5000 - 40000

是否可以不重新压缩整个文件?

斯蒂芬

【问题讨论】:

  • 您想更改 original 文件,对吗?不是压缩文件?
  • 正确。结果也会影响压缩的。但是我知道的数据必须应用在原始文件之上。想象一下类似于原始文件的差异。但是解压缩 100GB 需要花费太多时间,然后应用差异,然后重新压缩几乎相同的数据(差异仅更改文件的 1-5% 左右)。
  • @disaster123 我有一种感觉,你已经知道这行不通,即使在理论上也是如此。对于输入的任何变化,任何压缩方法都会产生完全不同的输出。
  • 只能通过解压、修改、重新压缩来实现。甚至改变一个字节也会改变之后的一切。
  • @AndyLester,它也可能会改变以前的情况。这不是游程编码。 :)

标签: linux file gzip compression data-compression


【解决方案1】:

是否要更改文件大小无关紧要(因为生成的 gzip 无论如何都不会根据原始文件大小进行布局),但是如果您将压缩文件拆分为多个部分,以便您想要修改的部分是在孤立的块中,并使用多文件压缩方法而不是单文件 gzip 方法,您可以只更新更改的文件,而无需解压缩和压缩整个文件。

在你的例子中:

bytes1-7.bin        \
bytes8-10.bin        \ bytes.zip
bytes11-4999.bin     /
bytes5000-40000.bin /

然后您可以更新bytes8-10.binbytes5000-40000.bin,但不能更新其他两个。但这是否会花费更少的时间是值得怀疑的。

【讨论】:

    【解决方案2】:

    总之,没有。有必要用总比特数完全相同但内容不同的新块替换一个或多个放气块。如果使用 deflate 时新数据的可压缩性降低,这将变得不可能。即使它更可压缩,它也需要大量的手动操作来尝试使位匹配。而且可能仍然不可能。

    【讨论】:

      【解决方案3】:

      gzip 的手册页说“如果您希望创建一个包含多个成员的单个存档文件,以便以后可以独立提取成员,请使用 tar 或 zip 之类的存档程序。”我相信这意味着 gzip 压缩继续通过文件,因此是上下文相关的,因此不会允许你想要的。

      解压缩/修补/重新压缩,或切换到数据的不同表示形式(可能是单独压缩文件的未压缩 tar 或 zip,因此您只需解压缩/重新压缩要更改的文件。)后者将一般来说,不要将数据存储得如此紧凑,但这是您必须做出的权衡。

      【讨论】:

      • 手册页中的那句话是关于在同一个存档中存储多个文件的能力,并且只能解压缩一个或一些其中,与可压缩性或这个问题的细节无关。如果这是 tar 或 zip,答案将是相同的;无法修改压缩流。
      • Tar 不压缩;修改 tar 存档可能的。我相信 Zip 以每个文件为基础进行压缩(或者可以配置为这样做),这也允许单独的文件提取/替换。问题是 gzip 是否提供了后一种选择,我引用手册页作为强烈指示它这样做。因此,bzim 提出的分离压缩和归档的提议(该提议适用于这些其他格式)将适用于 gzip。我坚持我的答案。
      猜你喜欢
      • 1970-01-01
      • 2017-02-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-15
      相关资源
      最近更新 更多