我需要一些帮助来有效地存储一些数据。我有一个很大的对象列表(大约 100.000)并且想用一个系数存储这些项目之间的关联。并非所有项目都是关联的,事实上我有一些关于 1 Mio 的东西。协会。在引用这两个项目时,我需要快速访问这些关联。我所做的是这样的结构:
Map<Item, Map<Item, Float>>
我用 HashMap
和 Hashtable
试过了。两者都工作正常并且速度足够快。我的问题是,所有这些 map 都会在内存中产生大量开销,对于给定的场景,具体超过 300 MB。是否有占地面积较小的 Map-Implementation?是否有更好的算法来存储此类数据?
最佳答案
这里有一些想法:
存储在
Map<Pair<Item,Item>,Float>
中.如果您担心分配新的Pair
对于每个查找,并且您的代码是同步的,您可以保留一个查找对实例。松开外层 map 为
Map<Item, ?>
.该值可以是一个简单的{Item,Float}
第一个关联的元组,少量关联的小元组数组,然后提升为完整的 Map。使用 Commons Collections'
Flat3Map
用于内部 map 。如果您严格控制 Items,并且 Item 等价是引用(即每个 Item 实例不是
equal
到任何其他 Item 实例,那么您可以为每个实例编号。既然您在谈论 < 20 亿个实例,单个 Long 将表示具有一些位操作的 Item 对。然后如果使用 Trove 的TLongObjectHashMap
, map 会变得更小
关于java - 存储项目到项目关联的算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6878935/