0

我有一个 Web 服务器,其中包含许多可供下载的压缩存档文件(zip 文件)。我想大大减少这些档案在服务器上占用的磁盘空间。

关键的见解是,这些档案实际上是相同未压缩内容的略有不同的版本。如果您解压缩这些档案中的任何两个并对结果进行比较,我希望您会发现差异大约是档案总大小的 1%。

这些档案实际上是 JAR 文件,但压缩细节——我相信——无关紧要。但这解释了,以特定压缩格式提供这些档案是不可协商的:这是服务器的基本目的。

就其本身而言,为这些档案的内容安装差异存储对我来说不是问题,从而大大减少了档案的磁盘占用空间。有很多方法可以做到这一点,使用增量编码或理解共享的压缩文件系统(例如,我相信btrfs理解块共享,或者我可以使用快照来强制执行它)。

问题是,我如何从这些文件中生成压缩的 zip?我拥有的服务器的计算能力非常低,当然不足以从块共享内容中即时重新创建 JAR 。

是否有一种编程方式将未压缩级别的共享内容公开给压缩级别?一种易于翻译为 zip 的增量压缩格式 ?

我应该寻找一种缓存解决方案以及动态生成 JAR 吗?这至少会减轻生成请求最多的 JAR 的计算痛苦。

专门的硬件可以非常快速地产生拉链,但我宁愿避免花费。随着对服务器的请求数量的增长,它也不是一个非常可扩展的解决方案。

4

2 回答 2

1

如果 1% 的差异被涂抹在所有 jar 文件中的所有条目中,那么您无需大量重新压缩就无能为力。

另一方面,如果 1% 的差异集中在少数 jar 条目中,而大多数 jar 条目没有变化,那么就有希望了。您可以将所有单独的 jar 条目保存在服务器上它们自己的 jar 文件中,并且对于要提供的每个 jar 文件,只需保留这些单独的 jar 条目文件的列表以进行组合。编写一个快速实用程序来获取一组 jar 文件并将它们合并到一个 jar 文件中是很容易的。如果还没有的话。

于 2013-03-27T15:06:20.237 回答
1

我过去使用的一种方法是在一段时间内记录对 zip 文件的实际请求。如果您发现请求高度倾斜,那么您可以使用缓存来降低动态生成 zip 文件的成本。

基本上,按照您的建议实施差异存储。还要为实际​​的 .zip 压缩文件分配 LRU(或您喜欢的任何其他替换算法)的总存储量,例如 10%。每次用户请求 zip 时,如果它准备好了,您就从缓存中提供它,或者如果没有,则动态生成它并将其放入缓存中。

在一般情况下这可能效果不佳,但在实际请求通常是针对少量集中文件的常见情况下,它可能会解决问题。

否则,我将您的选择视为:

  1. 在磁盘上使用增量编码,然后更改客户期望的响应格式。例如,您可以为他们提供一种格式,而不是 zip,该格式基本上是他们重建文件所需的 delta 编码文件的位。在服务器端,您节省了大部分工作,因为您只是从磁盘提供或多或少未修改的文件,然后客户端必须将它们放在一起(现有客户端已经必须解压缩文件,所以也许这不是负担过重)。

  2. 仔细查看 .zip 格式并以一种可以提前完成大部分 .zip 工作的特殊方式存储您的文件。例如,类似于 delta 编码,但匹配查找的实际困难部分存储在磁盘上,因此对文件进行编码可能是一个非常快速的过程。然而,这需要对 zip 格式有深入了解的人来设计。

于 2016-02-19T01:15:02.087 回答