Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/351.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java是否有HashMap的并行处理实现?有可能吗? 搜索magic ParallelHashMap类_Java_Multithreading_Collections_Parallel Processing - Fatal编程技术网

Java是否有HashMap的并行处理实现?有可能吗? 搜索magic ParallelHashMap类

Java是否有HashMap的并行处理实现?有可能吗? 搜索magic ParallelHashMap类,java,multithreading,collections,parallel-processing,Java,Multithreading,Collections,Parallel Processing,更简洁地说,您可以使用多个线程来加速HashMap查找吗?有没有任何实现已经做到了这一点 在我的项目中,我们需要在内存中维护一个大型对象映射。我们从不在创建地图后修改地图,因此地图严格为只读。但是,此映射上的读取和查找性能对于应用程序的成功至关重要。安装应用程序的系统通常有许多可用的硬件线程。然而,我们的查找只利用单个线程从HashMap检索值。使用多线程(可能在池中)的分而治之方法是否有助于提高查找速度 我的大多数谷歌搜索都是徒劳的——返回大量关于并发问题的结果,而不是解决方案。任何建议都将不

更简洁地说,您可以使用多个线程来加速HashMap查找吗?有没有任何实现已经做到了这一点

在我的项目中,我们需要在内存中维护一个大型对象映射。我们从不在创建地图后修改地图,因此地图严格为只读。但是,此映射上的读取和查找性能对于应用程序的成功至关重要。安装应用程序的系统通常有许多可用的硬件线程。然而,我们的查找只利用单个线程从HashMap检索值。使用多线程(可能在池中)的分而治之方法是否有助于提高查找速度

我的大多数谷歌搜索都是徒劳的——返回大量关于并发问题的结果,而不是解决方案。任何建议都将不胜感激,但如果你知道一个现成的解决方案,你是了不起的

同样值得注意的是,所有键和值都是不可变的。哈希代码值在实例化时预先计算并存储在对象本身中

至于实施的细节,地图上大约有35000个项目。键和值都是对象。键是自定义查找键,值是字符串。目前,我们最多每秒可以处理5000次查找(这包括一些其他逻辑的开销,但主要的瓶颈是map实现本身)。但是,为了满足我们未来的性能需求,我希望将这个数字提高到每秒10000次左右。按照大多数正常标准,我们当前的实现速度很快——只是我们需要更快


在35000个值的映射中,平均有一个哈希代码冲突,因此我猜测哈希代码分布合理。

哈希映射具有恒定的查找时间。不确定如何才能真正加快速度,因为尝试让多个线程执行哈希函数只会导致它变慢。

听起来你应该进行分析。你可能会有很高的碰撞率。您还可以尝试在HashMap中使用较低的loadFactor,以降低冲突概率

此外,如果hashcode是预计算的,那么get()除了mod和一些equals()之外没有多少工作要做。equals()在关键对象上的速度有多快?

来自(我已更改了重点):

请注意,此实现不可用 同步的。如果有多个线程 同时访问此地图,和 至少有一个线程修改 在结构上映射,它必须是 外部同步

由于您的HashMap从未被修改过,您可以安全地让多个线程从中读取。实现锁定是不必要的。(对于线程共享对不可变数据的访问的任何情况也是如此;通常,实现线程安全的最简单方法是不共享任何可写内存)


为了确保您的代码不会意外地修改映射,我会在构建映射后立即使用。不要让对原始可修改映射的任何引用停留。

因此您的哈希代码是预计算的,并且equals函数很快-在这种情况下,您的hashmap get应该非常快

您是否分析了您的应用程序以证明hashmap确实是瓶颈

如果您有多个应用程序线程,那么它们都应该能够同时从hashmap执行自己的GET—因为您不修改映射,所以不需要从外部同步GET。使用hashmap的应用程序是否具有足够的线程,能够使用所有硬件线程


由于哈希表的内容是不可变的,因此可能值得研究—使用完美的哈希函数,您不应该在哈希表中发生冲突或需要链接,这可能会提高性能。我现在还不知道java实现,但是在C/C++中,有一个问题可以回答:是的,绝对可以。只要你不写信给它

你必须手工制作,这会有点棘手。在尝试之前,您是否尽可能多地进行了优化

在C++中,在Shash集中查看谷歌的密集散列映射类。

在Java中,如果使用原语键进行映射,请使用Trove或Colt映射

这就是说,您的并行哈希映射开始了:如果您选择n个哈希函数并生成n个线程来搜索每个路径(在n个插入点中的每一个进行探测/链接),您将获得相当好的加速。要小心,因为创建线程的成本很高,所以在构建时生成线程,然后阻止它们,直到需要它们为止


希望锁定的成本不会高于查找的成本,但这取决于您的实验。

您在评论中提到了这一点:

我正在做5个参考数字之间的相等检查

由此我推断,您的散列计算也在使用这5个数字进行一些计算。为了获得良好的HashMap性能,此计算的结果应该随机分布在所有可能的int值上。从:

此实现提供了 系统的恒定时间性能 基本操作(get和put), 假设散列函数分散 这些元素在 水桶

换句话说,如果您有一个好的散列函数,那么无论元素计数如何,查找时间都应该保持不变。存储三个数字的类的良好函数示例(如注释所示,使用a来减少异或产生零的可能性):

坏的哈希代码函数示例:

return (this.a + this.b + this.c);

我认为您需要证据证明HashMap上的get()方法就是延迟所在。我认为这是非常不可能的
return (this.a + this.b + this.c);