有没有一个Java库可以缓存文件?

5
有没有一种Java库可以将文件缓存在内存和磁盘中?基本上,我希望该库将文件缓存到内存中。但是,如果内存缓存变得比某个阈值大,其中一些文件应写入磁盘。是否有任何Java库可以实现这一点?
更新:
只是一些一般性的评论。
我只会使用这些文件一次。它们只是临时文件。在一个完美的世界里,我会把它们都保存在内存中。然而,我认为我会用完内存。我想我真正寻找的是某种分页系统。可以让我避免用尽内存,但也可以避免将所有内容都写入磁盘。

很可能,您的操作系统已经使用未使用的内存来缓存文件。您认为这种机制有哪些不足之处? - NPE
2
几乎每个非嵌入式操作系统都在后台处理这个问题;您是否有特定的性能问题需要解决? - Dave Newton
@aix 如果我只是将文件写入内存,我会用尽堆内存。 - GC_
@Grae,写入文件时如何使用堆内存? - Peter Lawrey
@Peter Lawrey 我应该更清楚地说。通常,我只会将整个文件保留在内存中。然而,当太多文件同时保存在内存中时,我希望该库自动将一些文件分页到磁盘上。 - GC_
4个回答

3
当然,您可以尝试使用Terracotta或EhCache。或者在Google上搜索“java cache”并选择其他工具。

我认为除了ehcache-core之外,几乎所有东西都会给你提供Terracotta :) - Dave Newton

1
操作系统会自动缓存文件。它还会自动将最近使用的文件部分保留在内存中(可以部分缓存文件)。我建议您让操作系统为您进行缓存,并找到一种有效的方法在Java和操作系统之间获取数据。

当您将数据写入磁盘时,它会进入操作系统的写缓存,并在可以时迁移到物理磁盘上。(在Java IO中不支持将其提交到磁盘并知道它实际已被写入。在NIO中有FileChannel.force()来执行此操作。如果您在Unix上使用tmpfs,甚至可能不会这样做。) - Peter Lawrey
我认为你可能是对的,文件可能会自动放入操作系统的缓存中,并不一定立即放入物理磁盘中。但是,一旦我写入文件,我必须假设它可以被写入磁盘。我正在尝试避免任何写入磁盘的情况。我只希望应用程序在内存耗尽或接近耗尽时才写入磁盘。 - GC_
当内存接近耗尽时,它可能无法快速地回收内存(您将受到磁盘速度的限制)。如果大部分数据已经在磁盘上,而您的内存不足,则不会遇到同样的问题。我建议您查看内存映射文件,这些文件模糊了内存中的内容和仅存在于磁盘上的内容之间的界限。 - Peter Lawrey
使用映射内存文件,我认为在读取文件之前仍然需要将整个文件写入磁盘。这是正确的吗? - GC_
内存映射文件在这方面有作弊的嫌疑。如果你设置大小为1GB,它会创建稀疏文件,直到你使用文件中的页面,它实际上并不会占用这么多磁盘空间。也就是说,即使文件显示它们是你想要的大小,磁盘空间也不会立即改变。 - Peter Lawrey
显示剩余2条评论

0

我在使用ehcache时运气很好。它非常可配置。


你有一些开始的想法吗?我并不是真的想要缓存一个文件多次使用。我只是想在内存用尽时缓存一个文件磁盘。 - GC_


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接