我的java程序可以使用磁盘作为大型对象的堆吗?

我的java程序可以使用磁盘作为大型对象的堆吗?,java,memory,object,heap,Java,Memory,Object,Heap,我想使用java来处理最终将超过100GB的数据结构。我需要以1:1的比例写和读,尽可能多的每秒。在Java格式中,它是一个HashMap>。我可以像在RAM中一样在磁盘中保存和操作它吗?这可以兼作持久性方案吗?可以,但您可能首先要了解访问模式。如果你随机搜索了很多次,而你没有使用SSD,那么每一次IO都会有毫秒的等待时间。如果您只在某些区域内搜索,您可能希望将这些部分猛击到内存中。尽量按照访问模式将其数据组织成集群。不,在Java中不能将磁盘文件用作堆。您可以将文件映射到地址空间,但它不会是堆

我想使用java来处理最终将超过100GB的数据结构。我需要以1:1的比例写和读,尽可能多的每秒。在Java格式中,它是一个HashMap>。我可以像在RAM中一样在磁盘中保存和操作它吗?这可以兼作持久性方案吗?

可以,但您可能首先要了解访问模式。如果你随机搜索了很多次,而你没有使用SSD,那么每一次IO都会有毫秒的等待时间。如果您只在某些区域内搜索,您可能希望将这些部分猛击到内存中。尽量按照访问模式将其数据组织成集群。

不,在Java中不能将磁盘文件用作堆。您可以将文件映射到地址空间,但它不会是堆的一部分;i、 您将无法使用它来保存常规Java对象

要做到这一点,最简单的方法(如果您有足够的RAM,并且运行的是64位操作系统和64位JVM)就是给JVM一个巨大的堆。但我想这不是你的选择。因此,您的选择将是:

  • 使用常规数据库
  • 使用现有的现成Java数据缓存产品
  • 尝试滚动您自己的数据缓存

这里有一些“缓存”软件包可以帮助您。我想到了Ehcache。它将允许您创建一个缓存,在内存中存储有限的对象,并将其他对象溢出到磁盘。这一切都是在后台完成的,所以您所要做的就是从缓存中获取/放入。

您使用的是什么操作系统?(尽可能具体。包括32位还是64位。)但我的答案是:编写一个完全符合您需要的数据结构。不要试图强迫一个现有的结构去做它不是设计来做的事情。看看。你可以看看,也许,某种数据库?或者是一个快速的NoSQL解决方案?谷歌的Checkout LevelDB()。您将需要这个库()从Java调用它。