我有一个Java project需要大量内存来执行一种启发式搜索过程。原则上,计算问题的任意解决方案可能需要基本上无限制的RAM,但实际上我知道真实世界的实例有时可以解决大约数TB(当前缓存在物理连接的磁盘上)。
是否存在开放或封闭的源项目,以便在不同计算机上运行的多个JVM上虚拟化RAM?
目前,我可以托管在多个客户端上运行的本地搜索,并通过服务器进行协调。但是,这不是我想要完成的。
为了以数学上一致的方式解决我的问题,主要功能必须在单线程范例中使用虚拟化内存汇集在所有客户端计算机的总和上。我愿意自己编写这样一个虚拟化层,但想知道是否有人知道现有的解决方案,开源或封闭源。
大多数标准云解决方案都不适合这项任务,因为它们往往会限制可访问内存〜1TB,而且成本也超出了我的承受能力。
答案 0 :(得分:2)
您可以使用Chronicle Map,Queue或Bytes来利用比Java中的主内存更大的虚拟内存。 所有这些解决方案都支持内存映射数据在JVM中多次主内存。
它们可以在同一台机器上的JVM之间共享,每台机器上具有本机内存访问速度。对于内存中的小记录,延迟通常为亚微秒。大多数数据网格解决方案都具有亚毫秒级的读/写访问权限。
Chronicle Map是一个键值存储,任何客户端在一台机器上使用的最大值为10 TB。
Chronicle Queue是一个适合顺序读/写的日志,最大的是100 TB。
您可以使用Chronicle Bytes共享不断增长的内存映射文件。您可以拥有多个100 + TB的文件。
所有都是Apache 2.0开源。
要跨多台计算机共享数据访问权限,您可以使用Chronicle Engine进行分布式访问。
免责声明:我帮助编写了这些模块。
答案 1 :(得分:1)
Terracotta有一个分布式共享内存池,可能会让您接近您想要的内容,具体取决于具体细节。
还有许多内存虚拟化产品听起来与您正在寻找的类似。应检查ScaleMP,Wombat Data Fabric和RNA网络的适用性。
老实说,如果你可以修改你的算法来处理Apache Spark的处理方式,我认为你会得到更好的结果,但假设你必须有许多机器提供ram,考虑让这个RAM无需动力和转移它进入Hadoop / Spark类型处理(在Hadoop中,ram片段确实是跨磁盘的解决方案的片段,在Apache Spark中,它们是相同的,但是在真实RAM中智能缓存)。