在 java 中使用文件作为大型地图的存储介质
Using a file as a storage medium for a large Map in java
我有大量数据需要存储在 Map<String, int...>
中。我需要能够执行以下功能:
containsKey(String key)
get(String key).add(int value)
put(String key, singletonList(int value))
entrySet().iterator()
我最初只是使用 HashMap<String, ArrayList<Integer>>
,其中 singletonList
是一个创建新 ArrayList<Integer>
并将给定的 value
添加到其中的函数。但是,此策略无法很好地扩展到我正在使用的数据量,因为它将所有内容都存储在 RAM 中,而我的 RAM 不足以存储所有数据。
我的下一个想法是将所有内容转储到一个文件中。然而,这将意味着 get
、containsKey
和 put
将成为非常昂贵的操作,这是完全不可取的。当然,我可以对所有内容进行排序,但在大文件中通常很难做到这一点。
我想知道是否有更好的策略。
您为什么不尝试使用 ObjectOutputStream 将地图存储到文件中,您可以使用 ObjectInputStream 从地图中获取数据。
希望对你有帮助。
使用嵌入式数据库引擎(键值存储),例如MapDB,是一种方法。
来自MapDB官网:
MapDB is embedded database engine. It provides java collections backed by disk or memory database store. MapDB has excellent performance comparable to java.util.HashMap and other collections, but is not limited by GC. It is also very flexible engine with many storage backend, cache algorithms, and so on. And finally MapDB is pure-java single 400K JAR and only depends on JRE 6+ or Android 2.1+.
如果适合您,您可以从 here 开始。
我有大量数据需要存储在 Map<String, int...>
中。我需要能够执行以下功能:
containsKey(String key)
get(String key).add(int value)
put(String key, singletonList(int value))
entrySet().iterator()
我最初只是使用 HashMap<String, ArrayList<Integer>>
,其中 singletonList
是一个创建新 ArrayList<Integer>
并将给定的 value
添加到其中的函数。但是,此策略无法很好地扩展到我正在使用的数据量,因为它将所有内容都存储在 RAM 中,而我的 RAM 不足以存储所有数据。
我的下一个想法是将所有内容转储到一个文件中。然而,这将意味着 get
、containsKey
和 put
将成为非常昂贵的操作,这是完全不可取的。当然,我可以对所有内容进行排序,但在大文件中通常很难做到这一点。
我想知道是否有更好的策略。
您为什么不尝试使用 ObjectOutputStream 将地图存储到文件中,您可以使用 ObjectInputStream 从地图中获取数据。 希望对你有帮助。
使用嵌入式数据库引擎(键值存储),例如MapDB,是一种方法。
来自MapDB官网:
MapDB is embedded database engine. It provides java collections backed by disk or memory database store. MapDB has excellent performance comparable to java.util.HashMap and other collections, but is not limited by GC. It is also very flexible engine with many storage backend, cache algorithms, and so on. And finally MapDB is pure-java single 400K JAR and only depends on JRE 6+ or Android 2.1+.
如果适合您,您可以从 here 开始。