我正在开发一种分析工具,该工具从流程中读取输出并不断将其转换为内部格式。“记录阶段”完成后,对数据进行分析。数据全部保存在内存中。
但是,由于所有记录的信息都保存在内存中,因此记录的持续时间是有限制的。对于大多数用例来说,这是可以的,但应该可以运行更长时间,即使这会损害性能。
理想情况下,一旦 RAM 使用量达到一定限制,程序应该能够开始使用除 RAM 之外的硬盘空间。
这引出了我的问题:是否有任何现有的解决方案可以做到这一点?它必须在 Unix 和 Windows 上都可以工作。
如果不了解您的应用程序的更多信息,就不可能提供完美的答案。然而,这听起来有点像你在重新发明轮子。您是否考虑过使用像sqlite这样的进程内数据库库?
如果您使用它或类似的东西,它将负责将数据移入和移出磁盘和内存,并同时为您提供强大的 SQL 查询功能。即使您的日志数据采用自定义格式,如果每个项目都有某种键或索引,那么小型轻型数据库也可能是一个不错的选择。
为了在内存满后使用磁盘,我们使用了 EhCache 等Cache 技术。它们可以配置要使用的内存量,并溢出到磁盘。
但是它们也有更智能的算法,您可以根据需要进行配置,例如将过去 10 分钟内未使用的数据发送到磁盘等......这对您来说可能是一个加分项。
这似乎太明显了,但是内存映射文件呢?这可以满足您的需求,甚至允许 32 位应用程序使用超过 4GB 的内存。原理很简单,您分配所需的内存(在磁盘上),然后将其中的一部分映射到系统内存中。例如,您可以映射 75% 的可用物理内存大小。然后对其进行处理,当您需要另一部分数据时,只需重新映射即可。这样做的缺点是您必须手动进行映射,但这并不一定是坏事。好处是您可以使用比物理内存和每个进程内存限制更多的数据。如果您在任何给定时间实际上只使用部分数据,它会非常有用。
可能有一些库会自动执行此操作,例如 KLE 建议的库(尽管我不知道那个库)。手动操作意味着您将学到很多知识并拥有更多控制权,但我更喜欢一个库,如果它在磁盘使用方式和时间方面完全符合您的要求。
这在 Unix 上的两个 Windows 上都类似。对于 Windows,这是Raymond Chen 的一篇文章,其中展示了一个简单的示例。