Jar 使用共享的底层内容存储和服务许多压缩存档

Jar 使用共享的底层内容存储和服务许多压缩存档,jar,filesystems,compression,storage,delta,Jar,Filesystems,Compression,Storage,Delta,我有一个web服务器,它有许多压缩的存档文件(zip文件)可供下载。我想大幅减少这些归档文件在服务器上占用的磁盘空间 关键之处在于,这些归档实际上是相同未压缩内容的略有不同的版本。如果您解压缩了这些归档文件中的任意两个,并对结果进行了diff,我希望您会发现diff大约是归档文件总大小的1% 这些归档文件实际上是JAR文件,但我相信压缩细节与此无关。但这说明,以特定的压缩格式提供这些档案是不可协商的:这是服务器的基本用途 就其本身而言,为这些归档文件的内容安装差异存储,从而大大减少归档文件集的磁

我有一个web服务器,它有许多压缩的存档文件(zip文件)可供下载。我想大幅减少这些归档文件在服务器上占用的磁盘空间

关键之处在于,这些归档实际上是相同未压缩内容的略有不同的版本。如果您解压缩了这些归档文件中的任意两个,并对结果进行了diff,我希望您会发现diff大约是归档文件总大小的1%

这些归档文件实际上是JAR文件,但我相信压缩细节与此无关。但这说明,以特定的压缩格式提供这些档案是不可协商的:这是服务器的基本用途

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

问题是,如何从这些文件生成压缩的拉链?我拥有的服务器的计算能力非常小,当然不足以通过块共享内容动态地重新创建JAR

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

我是否应该寻找一种缓存解决方案,同时动态生成JAR?这至少可以减轻生成请求最多的jar所带来的计算痛苦


有一种方法可以很快生产拉链,但我宁愿避免花费。随着对服务器的请求数量的增加,它也不是一个非常可扩展的解决方案。

如果所有jar文件中的所有条目都有1%的差异,那么不需要重新压缩就没有什么可以做的了


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

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

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

在一般情况下,这可能无法很好地工作,但在实际请求通常集中到少量文件的常见情况下,这可能会解决问题

否则,我认为您的选择如下:

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

  • 仔细查看.zip格式并以一种专门的方式存储文件,这种方式可以提前完成大部分.zip工作。例如,类似于增量编码,但匹配查找的实际硬部分存储在磁盘上,因此编码文件可能是一个非常快速的过程。然而,这需要有对zip格式有丰富知识的人来设计