从 diff 文件重建原始文件以节省磁盘空间

从 diff 文件重建原始文件以节省磁盘空间

每天下载 10GB 文本文件,文件约 2 亿行,约 1% 的行在第二天发生更改。我想保留日常文件作为备份,但我试图通过使用 CPU 来节省磁盘空间。

编辑 目前我发现的最好方法是保留 diff 文件并用patch(@Simon 建议的方式)重建它们,例如在 1 月 1 日下载大文件,然后在整个月内只diff 01jan.txt 02jan.txt > 02jan.diff; rm 02jan.txt对每月的每一天进行 diff 等操作。

有更好的方法吗?

答案1

这正是 Git、Bazaar 或 Subversion 等版本控制软件正在做的工作(还有一些额外的功能)。所以你的工作流程可能如下:

  • 在月初创建一个新的存储库。
  • 每天将新文件复制到存储库并提交更改
  • (可选)删除上个月的存储库。

我的文件每个月变化不大,只需每月使用一个存储库。

答案2

正如您提到的diff程序,我可以放心地假设您正在谈论文本文件......

正如您提到的 2 亿行中的 10GB,这似乎是一个平均行长度为 50 的单个文件,看起来不错。

  • 在这种情况下,版本控制系统是正确的选择。

您需要为您的问题找到正确的版本控制系统。让我假设您的信息:

  • 每天一个新的文件版本,并且每天有 1% 的内容发生变化。

鉴于它git不维护文件增量而是存储 gzip -4 压缩的完整文件,我预计在 aprox 之后。 2-3周后,git将消耗比你预期更多的磁盘空间。所以 git 不是适合你的情况的工具。

还有其他版本控制系统使用差异来处理历史记录。

  • RCS 存储反向差异,可能是一个解决方案,但 RCS 对于 > 256KBytes 的文件来说速度很慢,如果您不需要最新版本而是较旧的版本,RCS 需要更多时间。

  • SCCS 基于差异,但存储格式是所谓的weave format同时有效存储所有版本,并允许您在同一固定时间检索任何版本。

SCCS 将创建一个初始 10GB 历史文件,在您的情况下,每个新版本该历史文件都会增长 1%,因此我希望历史文件使用 aprox。一年后 36.5GB。对于 GIT,我预计一年后磁盘空间需求为 100-400GB。

SCCS 是开源的,可以从以下位置检索:

http://sccs.sourceforge.net

SCCS 自 1972 年(43 年)以来一直在维护,因此可以被视为成熟的;-) 顺便说一句:我不知道没有更快的版本控制系统。

答案3

查看“补丁”,这与我们几乎每天下载内核源代码时遇到的问题相同。这可用于使用差异文件更新原始文件或恢复到以前的版本。

相关内容