寻找神奇的 ParallelHashMap 类
更简洁一点,可以使用多线程来加速HashMap的查找吗?是否已经有任何实现可以做到这一点?
在我的项目中,我们需要在内存中维护一个大的对象图。我们从不在 map 创建后对其进行修改,因此该 map 是严格只读的。但是,此 map 上的读取和查找性能对于应用程序的成功绝对至关重要。将安装应用程序的系统通常有许多可用的硬件线程。然而,我们的查找仅使用单个线程从 HashMap 中检索值。使用多个线程(可能在池中)的分而治之方法是否有助于提高查找速度?
我的大多数谷歌搜索都没有结果 - 返回了很多关于并发问题而不是解决方案的结果。任何建议将不胜感激,但如果您知道开箱即用的解决方案,那您就太棒了。
另外值得注意的是,所有键和值都是不可变的。哈希码值在实例化时预先计算并存储在对象本身中。
至于实现的细节, map 中有大约 35,000 个项目。键和值都是对象。键是自定义查找键,值是字符串。目前,我们每秒最多可以处理大约 5,000 次查找(这包括一些其他逻辑的开销,但主要瓶颈是 map 实现本身)。但是,为了跟上我们 future 的性能需求,我希望这个数字达到每秒大约 10,000 次查找。按照大多数正常标准,我们当前的实现速度很快 - 只是我们需要它更快。
在我们的 35,000 个值的 Map 中,我们平均有大约一次哈希码冲突,所以我猜测哈希码分布合理。
最佳答案
因此您的哈希码是预先计算的并且 equals 函数很快 - 在这种情况下您的 HashMap 获取应该非常快。
您是否分析过您的应用程序以证明 hashmap 获取确实是瓶颈?
如果您有多个应用程序线程,它们都应该能够同时从散列图中执行它们自己的获取 - 因为您没有修改映射,所以不需要在外部同步获取。使用 hashmap 的应用程序是否具有足够的线程以能够利用所有硬件线程?
由于哈希表的内容是不可变的,因此可能值得研究 perfect hashing - 使用完美的散列函数,您永远不应该在散列表中发生冲突或需要链接,这可能会提高性能。我不知道手头有 java 实现,但在 C/C++ 中知道,有 gperf
关于java - 是否有可用于 Java 的 HashMap 的并行处理实现?有可能吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1381898/