存储大量小文件:存档与文件系统

时间:2011-06-01 16:29:40

标签: java performance caching storage

我正在创建一个需要大量图像缩略图的应用程序(~3000,5-25KB)。由于速度至关重要,我计划在应用程序启动时将这些图像加载到内存中。在运行时,将下载新的缩略图并将其添加到集合体中。

我可以将它们全部存储在一个文件夹中,但是当程序启动时,将数千个文件读入内存几乎没有效率。

我的第二个选择是将它们保存在某种(压缩)存档中。这将使存储本身和加载更有效(我认为)。但是,会定期添加新文件,这可能不会像将它们保存在文件夹中那样顺利。

在(压缩的)存档中存储小文件的缓存是不是一个坏主意? ZIP文件是否可行?我最好不要使用未压缩的档案(如果是,那是什么类型的)?

所有图像文件都是JPEG格式。

提前致谢!

编辑:我正在考虑放弃“在应用程序启动时将所有内容加载到内存中”的事情。这会简化我的问题。我最初将所有内容放在一个大文件中的想法现在似乎不太有用,因为一个目录中的许多文件的问题可以通过散列到子目录中来解决。

6 个答案:

答案 0 :(得分:1)

所有基于磁盘的存储和大多数数据库都以块的形式分配空间。大容量磁盘上的块可能很大。如果您有5kb文件和32kb磁盘块,则最终会在存储上浪费85%的空间。

使用存档不会压缩jpeg,因为jpeg编码算法已经这样做了。但它会为您节省存储介质上浪费的空间。它确实使事情变得更复杂,也许会慢一些。

答案 1 :(得分:1)

小文件压缩不是特别好,因此您可能无法获得太多压缩。

虽然加载文件会很快,因为它们较小,但解压缩会增加时间。你必须试验看哪个更快。

我认为真正的问题与迭代所有小文件时文件系统的效率有关,特别是如果它们都在一个文件夹中。当文件夹包含大量文件时,Windows因效率低而臭名昭着。

我会考虑做一些事情,比如将它们写入一个未压缩的文件,可以流入内存 - 也许不一定是连续的内存,因为这可能是一个问题。但想法是将它们全部放在一个文件中。然后编写某种索引,将文件名或其他标识符绑定到一个偏移量,从该偏移量可以确定内存中图像的位置。

最后可以添加新图像,并且索引会更新。

这不是花哨,但那是你想要避免的。存档甚至文件系统为您提供了大量的功能和灵活性,但却以效率为代价。当你知道自己想做什么时,有时简单就更好了。

我会考虑实现一个从文件夹中读取文件的解决方案,另一个将文件划分为子文件夹和子文件夹,以便在任何给定文件夹中不超过100个文件,然后为这些解决方案计时,这样您就可以进行比较了至。我认为一个简单的索引文件足够快,甚至不需要像你建议的那样预先加载图像 - 只需在需要时检索它们,并在内存中保留它们。 / p>

答案 2 :(得分:0)

在我看来,我认为zip文件的方式是一个坏主意,因为你将通过加载zip文件的过程减慢所有内容并解压缩以提取每个图像。

我认为缩略图的目的是本质上很小,所以你的应用加上硬件可以尽快加载它。因此,我认为最好根据需要加载每个图像。

答案 3 :(得分:0)

好吧,如果你有小的“几何”图片,你可以将它们实现为javax.swing.Icon类型的对象,而不是从文件系统加载的图像。 http://download.oracle.com/javase/6/docs/api/javax/swing/Icon.html

http://download.oracle.com/javase/tutorial/uiswing/components/icon.html

因此,您将使用Graphics绘图基元实现一个或多个将自身绘制到Graphics表面上的对象,而不是复制像素。

答案 4 :(得分:0)

如果这是一个Web应用程序,那么您可以获得的最佳性能提升是设置良好的HTTP缓存标头。为每个图像提供唯一的URL(同一图像的不同版本也有不同的URL),可以设置非常远的未来过期标头,因为更改图像会更改导致重新获取的URL。

我不会压缩,因为JPEG不能很好地压缩,只需花费CPU时间。

我建议只将图像存储到文件系统中,并考虑使用像jawr这样的库,或者实现自己的缓存策略。

答案 5 :(得分:0)

我知道这个问题已经回答了,但我认为除了压缩之外你还需要更多的选择。

虽然拉链是好的,但由于JPEG已经压缩,因此对JPEG的影响并不大。

您可能需要考虑的其他事项是:

  1. 将图像放入内容分发网络(CDN)
  2. 使用gzip压缩组件(意味着服务器将自动压缩每个响应),您不需要编写任何代码以便稍后解压缩 - 它会由浏览器自动处理。
  3. 由于您提到JPEG,您可能希望在所有JPEG上使用 JPEGTran .Run jpegtran。

    此工具执行无损JPEG操作(如旋转),还可用于优化和删除图像中的注释和其他无用信息(如EXIF信息)。 jpegtran -copy none -optimize -perfect src.jpg dest.jpg

  4. 使用图片精灵。不要让浏览器同时下载许多图像,而是要求浏览器只下载一个。
  5. 详情请参阅:http://developer.yahoo.com/performance/rules.html#opt_images

    对于如何提高网站性能的基本考试,您可以尝试在Firefox中安装YSlow(插件来检测不一致的代码)。

    希望有所帮助。

相关问题