【问题标题】:Caching of the data of a big file in memory in javajava在内存中缓存大文件的数据
【发布时间】:2012-08-10 07:51:01
【问题描述】:

您好,我正在从事自然语言处理的拼写校正项目,我应该从大小为 6.2 MB 1 GB 的文件中读取数据。虽然它工作正常,但我面临的问题是,每次运行 java 程序时,我都必须将数据加载到内存中,并且每次运行都需要相同的时间。

有没有什么办法可以将这些数据缓存到 java 中的内存中?有人可以建议我解决这个问题吗?

基本上我想知道的是,将大文件的内容存储在内存中以便我不必再次读取它的过程是什么?可以说文件是GB。

【问题讨论】:

  • 如果它是同一个文件,你能生成某种索引并将其存储在一个文件中吗?
  • 您希望您的数据在程序停止时保留在内存中?请添加一些行以明确您想要什么。看来我没听懂你的意思。
  • 您是否尝试分析您的代码以查看是否存在瓶颈,例如解析文件?
  • 将其编辑为 1GB 是一个完全不同的问题。
  • @NoxHarmonium 是的,这就是我最初想要的。实际上我现在拥有的文件很小,但在一周左右的时间里,我将合并来自小说和其他在线资源的数据.所以它必然会增加。所以那时我将不得不使用像缓存这样的高效东西来确保我不会再次读取内容。我希望这现在很清楚

标签: java algorithm memory-management garbage-collection nlp


【解决方案1】:

6.2 MB 的数据可能会存储在操作系统的缓存中,因为它是相对少量的数据,因此根本不需要花费太多时间来加载。您应该调查是否是解析这些数据需要很长时间,并可能将解析后的数据缓存到二进制文件中以便快速加载。

【讨论】:

    【解决方案2】:

    6.2 MB 不是很大,除非这需要很长时间并且您不能使用后台线程来加载文件,否则我不会担心。

    您可以使用内存映射文件,但使用起来并不简单。如果您有 1 GB 到 1 TB 的数据,内存映射文件非常有用。

    【讨论】:

      【解决方案3】:

      我在这里看到从文件加载/解析数据并创建缓存会导致您出现一些时间延迟,并且您希望每次都节省时间。

      在这种情况下,我建议您使用EHcache。 EHcache(它是ofcource开源和apache许可的)将为您维护cahce,防止您的应用程序出现内存不足错误,并将cahce的状态保存到磁盘。

      因此,在下次启动应用程序时,您可以将应用程序配置为直接从 EHcahce 数据文件启动,这样您就可以避免一次又一次地解析文件。

      您仍然可以将正在使用的任何 cahce 加载到内存中,唯一的区别是通过 EHCache API 加载它。

      【讨论】:

      • 如果加载文件是性能问题,我不会将它存储在不可预测的弱缓存中。要么有足够的内存来缓存文件,要么没有。对于这个问题,EHcache 只是矫枉过正;只需确保以足够的堆空间启动 VM。
      • 为什么 EHCache 有点过头了?我也将它用于缓存目的,因为它也可以存储在文件中。
      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 2015-01-21
        • 1970-01-01
        • 1970-01-01
        • 2012-06-17
        • 1970-01-01
        • 2013-05-19
        • 2018-09-07
        • 2013-05-31
        • 1970-01-01
        相关资源
        最近更新 更多