我想在地图中存储1 * 10 ^ 8个对象进行搜索。当我的程序启动时,它将读取并将这些对象存储在地图中。阅读结束后,这个地图永远不会被更新,util程序已经死了。我不希望jvm放弃任何一个。我知道database.yml
会浪费很多内存,是否有任何类型的地图可以存储这么多对象并节省内存?
我知道jvm会扫描这些对象,浪费时间。怎么狂热这个? 对不起,情况是:我正在写一个带有apache风暴的螺栓。我想从数据库中读取数据。当一个螺栓处理一个元组时,我需要用数据库中的数据来计算。为了执行程序,我必须将它们存储在内存中。我知道jvm不善于管理大量内存,所以也许我应该尝试koloboke?
答案 0 :(得分:2)
HashMap
需要分配足够大小的数组以最小化哈希冲突 - 可能发生两个或更多不相等的对象具有相同的哈希码 - 这种情况的概率取决于哈希函数的质量。通过线性探测等技术解决冲突,这些技术存储未被占用的下一个(hash + i) mod length
索引的条目,二次探测,它存储下一个{{1未占用的索引,(hash + i^k) mod length
,用于存储每个存储桶的条目链表。通过增加后备阵列的长度来减少碰撞概率,因此内存消耗。
但是,您可以使用TreeMap
来存储树结构中的条目,这些条目仅创建与条目数i相等的节点数。即高效的内存使用。
请注意, get , put ,删除操作的复杂性存在差异。 HashMap
的复杂度为separate chaining
,而TreeMap
的复杂度为O(1)
。
假设您想要从大小为100 000 000的地图中获取条目,那么在最坏的情况下(要找到的元素是叶子,即位于树的最后一级),需要在树下传递的路径长度记录(100 000 000)= 8。
答案 1 :(得分:0)
好吧,我回来了。 首先我使用大约30g存储大约5x10 ^ 7键值输入..但gc不稳定。我使用字符串存储双重错误,它在内存中大于double,在java中字符是16位。在我改变了这个错误后,gc会更好......但还不够。最后我在mapdb中使用'filedb'来解决这个问题。