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