java - 存储项目到项目关联的算法

标签 java algorithm memory associations

我需要一些帮助来有效地存储一些数据。我有一个很大的对象列表(大约 100.000)并且想用一个系数存储这些项目之间的关联。并非所有项目都是关联的,事实上我有一些关于 1 Mio 的东西。协会。在引用这两个项目时,我需要快速访问这些关联。我所做的是这样的结构:

Map<Item, Map<Item, Float>>

我用 HashMapHashtable 试过了。两者都工作正常并且速度足够快。我的问题是,所有这些 map 都会在内存中产生大量开销,对于给定的场景,具体超过 300 MB。是否有占地面积较小的 Map-Implementation?是否有更好的算法来存储此类数据?

最佳答案

这里有一些想法:

  1. 存储在 Map<Pair<Item,Item>,Float> 中.如果您担心分配新的 Pair对于每个查找,并且您的代码是同步的,您可以保留一个查找对实例。

  2. 松开外层 map 为Map<Item, ?> .该值可以是一个简单的 {Item,Float}第一个关联的元组,少量关联的小元组数组,然后提升为完整的 Map。

  3. 使用 Commons Collections' Flat3Map 用于内部 map 。

  4. 如果您严格控制 Items,并且 Item 等价是引用(即每个 Item 实例不是 equal 到任何其他 Item 实例,那么您可以为每个实例编号。既然您在谈论 < 20 亿个实例,单个 Long 将表示具有一些位操作的 Item 对。然后如果使用 Trove 的 TLongObjectHashMap , map 会变得更小

关于java - 存储项目到项目关联的算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6878935/

相关文章:

c++ - 三个数字中的最小值

c# - 使用 linq 对列表进行采样

c++ - 在 C++ 中将两个对象塞进一个字节中

php - php进程的内存使用情况

java - 查找实现特定接口(interface)的所有 Java bean

java - Twitter4J get Direct Messages() 不再起作用了吗?

c# - 如何计算任意数量的链接子对象?

python - 如何确定 SLURM 中 python 脚本步骤内存超出的时间点

java - Google Web Toolkit——仅适用于 Gmail 类型的应用程序?

java - 在 Android 中解密 Rijndael