嗨,我正在从事自然语言处理的拼写校正项目,我应该从大小为6.2 MB 1 GB 的文件中读取数据。虽然它工作正常,但我面临的问题是,每次运行 java 程序时,我都必须将数据加载到内存中,并且每次运行都需要相同的时间。
有没有什么办法可以将这些数据缓存到java中的内存中?有人可以建议我解决它吗?
基本上我想知道的是,在内存中存储大文件内容的过程是什么,这样我就不必再次阅读它了?可以说文件是GB。
嗨,我正在从事自然语言处理的拼写校正项目,我应该从大小为6.2 MB 1 GB 的文件中读取数据。虽然它工作正常,但我面临的问题是,每次运行 java 程序时,我都必须将数据加载到内存中,并且每次运行都需要相同的时间。
有没有什么办法可以将这些数据缓存到java中的内存中?有人可以建议我解决它吗?
基本上我想知道的是,在内存中存储大文件内容的过程是什么,这样我就不必再次阅读它了?可以说文件是GB。
6.2 MB 的数据可能会存储在操作系统的缓存中,因为它是相对少量的数据,因此根本不需要花费太多时间来加载。您应该调查是否是解析这些数据需要很长时间,并可能将解析后的数据缓存到二进制文件中以便快速加载。
6.2 MB 不是很大,除非这需要很长时间并且您不能使用后台线程来加载文件,否则我不会担心。
您可以使用内存映射文件,但这些文件使用起来并不简单。如果您有 1 GB 到 1 TB 的数据,内存映射文件很有用。
我在这里看到从文件加载/解析数据并创建缓存会导致您出现一些时间延迟,并且您希望每次都节省时间。
在这种情况下,我建议您使用EHcache。EHcache(它是ofcource开源和apache许可的)将为您维护cahce,防止您的应用程序出现内存不足错误,并将cahce的状态保存到磁盘。
因此,在下次启动应用程序时,您可以将应用程序配置为直接从 EHcahce 数据文件启动,这样您就可以避免一次又一次地解析文件。
您仍然可以将您正在使用的任何 cahce 加载到内存中,唯一的区别是通过 EHCache API 加载它。
如果您打算对程序进行编码/调试,并且似乎为您所做的每个更改重新加载资源需要太多时间,那么请考虑JRebel Social(如果这是一个非商业项目,或者JRebel如果是)。它允许您在不重新启动 VM 的情况下修复代码中的错误或进行一些更改,因此您可以保留加载的数据(例如,存储在静态变量中),而无需使用任何缓存,甚至不必重新启动 VM。请参阅我之前的问题:Loading Resources Once in Java。但是如果它是用于生产的,并且您的目的是节省内存而不是节省加载时间(在大多数情况下,这是一个仅限于启动期间的问题),那么 EhCache 或其他缓存库就足够了。