在java中使用文件作为大型地图的存储介质

在java中使用文件作为大型地图的存储介质,java,file,dictionary,data-structures,collections,Java,File,Dictionary,Data Structures,Collections,我有大量数据需要存储在地图中。我需要能够执行以下功能: containsKey(字符串键) get(字符串键)。add(int值) put(字符串键,单音列表(int值)) entrySet().iterator() 我最初只是使用一个HashMap,其中singletonList是一个函数,它创建一个新的ArrayList,并将给定的值添加到其中。但是,这种策略不能很好地扩展到我使用的数据量,因为它将所有数据都存储在RAM中,而且我的RAM不够大,无法存储所有数据 我的下一个想法是将所有内容都

我有大量数据需要存储在
地图中
。我需要能够执行以下功能:

  • containsKey(字符串键)
  • get(字符串键)。add(int值)
  • put(字符串键,单音列表(int值))
  • entrySet().iterator()
  • 我最初只是使用一个
    HashMap
    ,其中
    singletonList
    是一个函数,它创建一个新的
    ArrayList
    ,并将给定的
    值添加到其中。但是,这种策略不能很好地扩展到我使用的数据量,因为它将所有数据都存储在RAM中,而且我的RAM不够大,无法存储所有数据

    我的下一个想法是将所有内容都转储到一个文件中。然而,这意味着
    get
    containsKey
    put
    将成为非常昂贵的操作,这是完全不可取的。当然,我可以把每件事都整理好,但在一个大文件中这通常是很困难的


    我想知道是否有更好的策略。

    为什么不尝试使用ObjectOutputStream将地图存储到文件中,然后使用ObjectInputStream从地图中获取数据。
    我希望它能帮助您。

    使用嵌入式数据库引擎(键值存储),例如,是一种方法

    从MapDB的官方网站:

    MapDB是嵌入式数据库引擎。它提供由磁盘或内存数据库存储支持的java集合。MapDB具有与java.util.HashMap和其他集合相当的优异性能,但不受GC的限制。它也是一个非常灵活的引擎,具有许多存储后端、缓存算法等。最后,MapDB是纯java单个400K JAR,只依赖于JRE 6+或Android 2.1+


    如果这对您有效,您可以从开始。

    交换/虚拟内存不是这里的选项吗?@Natecat我更喜欢程序内解决方案。我现在使用的是一台电脑,而不是一台专用服务器,我不想不必要地干扰它。你有没有调查过?MapDB是嵌入式数据库引擎。它提供由磁盘或内存数据库存储支持的java集合。MapDB具有与java.util.HashMap和其他集合相当的优异性能,但不受GC的限制,这看起来是可行的。把它写下来作为一个答案,我会接受,或者如果你是从另一个SO问题中得到的,请随意将这篇文章标记为重复,我会附议。谢谢!:-)我想要一个文件的原因是不必将整个地图存储在RAM中。这并不能解决这个问题。这似乎工作得很好。谢谢我想补充一点,这不仅适用于
    Map
    ,而且适用于
    Set