在Java中将大文件的数据缓存到内存中

4

你好,我正在从事自然语言处理的拼写校正器项目,并且需要从一个文件中读取数据。这个文件的大小是1GB而不是6.2MB。虽然它现在能够很好地工作,但我面临的问题是每次运行Java程序时都必须加载数据到内存中,而这需要同样的时间。

有没有办法将这些数据缓存在Java的内存中?有没有人可以提供一些解决方法?

基本上我想知道如何将一个大文件的内容存储在内存中,以便我不必再次读取它。比如说文件有GB级别的大小。


如果是同一个文件,你能否生成某种索引并将其存储在文件中? - MadProgrammer
你希望在程序停止时数据仍然保留在内存中吗?请添加一些代码行以明确你的意图。似乎我没有正确理解你的意思。 - Marvin Emil Brach
1
你尝试过对代码进行分析以查看是否存在瓶颈,例如文件解析吗? - posdef
1
将其编辑为 1GB,这就是完全不同的问题了。 - Sean Dawson
@NoxHarmonium 是的,这就是我一开始想要的。实际上,我现在拥有的文件很小,但是在一周左右,我将从小说和其他在线资源中合并数据。因此,它肯定会增加。所以到那时,我将不得不使用像缓存这样高效的东西,以确保我不会一遍又一遍地读取内容。我希望现在清楚了。 - Max
4个回答

5

由于数据量相对较小,大约有6.2 MB,所以很可能会被存储在操作系统的缓存中,加载时间不应该太长。您应该调查是否是解析数据花费了较长时间,可以将解析后的数据缓存到二进制文件中以便快速加载。


4

6.2 MB并不算很大,除非加载该文件需要很长时间并且无法使用后台线程加载,否则不必担心。

您可以使用内存映射文件,但这些文件的处理不太简单。如果您有1 GB至1 TB的数据,内存映射文件会很有用。


2
我看到你从文件中加载/解析数据并创建缓存的过程造成了一些时间延迟,你想节省这个过程的时间。
在这种情况下,我建议你使用EHcache。EHcache(当然是开源的,并且apache许可证)将为您维护缓存,防止您的应用程序出现内存不足错误,并将缓存状态保存到磁盘上。
因此,在您的应用程序下一次启动时,您可以配置应用程序直接从EHcahce数据文件启动,这样您就可以避免反复解析文件。
您仍然可以将任何您正在使用的缓存加载到内存中,唯一的区别是通过EHCache API进行加载。

如果文件加载是性能问题,我不会将其存储在不可预测的弱缓存中。要么有足够的内存来缓存文件,要么没有。EHcache对于这个问题来说只是过度设计;只需确保您使用足够的堆空间启动VM即可。 - Cephalopod
为什么EHCache过于复杂?我也使用它来进行缓存,因为它可以存储在文件中。 - Kenston Choi

1
如果您打算编写/调试程序,而每次更改都需要重新加载资源似乎需要太多时间,请考虑使用JRebel Social(如果这是非商业项目)或JRebel(如果是商业项目)。它允许您在不重启VM的情况下修复代码中的错误或进行一些更改,因此您可以保留已加载的数据(例如存储在静态变量中),而无需使用任何缓存甚至无需重启VM。请参阅我的先前问题:Java中仅加载资源一次。但是,如果是为了生产,并且您的意图是节省内存而不是节省加载时间(在大多数情况下仅在启动期间存在问题),则EhCache或其他缓存库就足够了。

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