Java 在地图中并行搜索多个关键点
给定一个Java 在地图中并行搜索多个关键点,java,dictionary,parallel-processing,Java,Dictionary,Parallel Processing,给定一个地图最多一百万个项目。我知道如何查询地图上的5K密钥,但我不确定它们是否在地图中 目前,我正在使用树形图,逐个搜索每个项目。这似乎是次优的。是否有一种已经实现的方法来查询地图中的X键 搜索的结果应该是在地图中找到的项目的子集,以便进一步查询-排序无关 我希望使用流,但显然,这只是用于收集 注意:根据我在地图上看到的,数字是印象,可能不是上限…没有比查询地图上的每个元素更好的方法了: List<V> vs = keysToSearch.stream()
地图
最多一百万个项目。我知道如何查询地图上的5K密钥,但我不确定它们是否在地图中
目前,我正在使用树形图,逐个搜索每个项目。这似乎是次优的。是否有一种已经实现的方法来查询地图中的X键
搜索的结果应该是在地图中找到的项目的子集,以便进一步查询-排序无关
我希望使用流
,但显然,这只是用于收集
注意:根据我在地图上看到的,数字是印象,可能不是上限…没有比查询地图上的每个元素更好的方法了:
List<V> vs = keysToSearch.stream()
.map(k -> map.get(k))
.filter(Objects::nonNull)
.collect(Collectors.toList())
List vs=keystearch.stream()
.map(k->map.get(k))
.filter(对象::非空)
.collect(收集器.toList())
如果您的数据结构在并发环境中工作,您也可以尝试使用并行流。没有比查询每个元素的映射更好的方法了:
List<V> vs = keysToSearch.stream()
.map(k -> map.get(k))
.filter(Objects::nonNull)
.collect(Collectors.toList())
List vs=keystearch.stream()
.map(k->map.get(k))
.filter(对象::非空)
.collect(收集器.toList())
如果您的数据结构在并发环境中工作,您也可以尝试使用并行流。假设内存对您来说不是问题。这里有一种方法 使用
retainAll
Set<String> mapKeys = new HashSet<String>(myMap.keySet());
mapKeys.retainAll(my5kKeys); //<--- all keys that match the my5kKeys...
Set-mapKeys=newhashset(myMap.keySet());
mapKeys.Retainal(my5kKeys)// 假设你的记忆力不是问题。这里有一种方法
使用retainAll
Set<String> mapKeys = new HashSet<String>(myMap.keySet());
mapKeys.retainAll(my5kKeys); //<--- all keys that match the my5kKeys...
Set-mapKeys=newhashset(myMap.keySet());
mapKeys.Retainal(my5kKeys)// 如果您的地图中有M个项目,并且您正在搜索K个键,那么您的最佳案例效率是O(min(M,K))。如果M非常大,那么最好检查每个K(可能是并行的,但必须逐个检查)
如果事实证明M比K小得多,那么只需检查所有M值,看看它们是否存在于K中,就可以做得更好。在任何情况下,您都希望检查较小集合的值与较大集合的值。如果您的地图中有M个项目,并且正在搜索K个关键点,那么您的最佳案例效率是O(min(M,K))。如果M非常大,最好检查每个K(可能是并行的,但必须逐个检查)
如果事实证明M比K小得多,那么只需检查所有M值,看看它们是否存在于K中,就可以做得更好。在任何情况下,都需要检查较小集合的值与较大集合的值。没有更好的方法来创建循环并单独搜索所有键。
像retainAll
这样的方法只是其他人编写的循环的包装器
然而,重要的是使用HashMap
而不是TreeMap
。Hashmaps包含的是O(1),而TreeMap
取O(log(n))
如果您需要用于其他内容的已排序集合,可以将数据放在树映射和哈希映射中,没有比创建循环和单独搜索所有键更好的方法了。
像retainAll
这样的方法只是其他人编写的循环的包装器
然而,重要的是使用HashMap
而不是TreeMap
。Hashmaps包含的是O(1),而TreeMap
取O(log(n))
如果您需要用于其他目的的已排序集合,您可以将数据放在树映射和哈希映射中是否有不执行并行流
的原因?(嗯,还有并行流)…还是没有给每个人带来真正的好处,我只是把它作为一种可能性添加了进去。你为什么不做并行流呢?(嗯,还有并行流)…仍然不是真正的优势,foreach
我只是可能添加了它。我担心内存是个问题,因为代码将由1-20个线程执行。这是最快的方法。因此,如果你的映射是1M+和20个线程之间。这意味着你需要为20M字符串留出空间…好吧,你可以进行计算。无论如何。你可以试一试。它可能没有看上去那么糟糕。我会试一试……这种方法有它的优点,但不返回映射,而是返回一个集合。我担心内存是个问题,因为代码将由1到20个线程执行。这是最快的方法。因此,如果你的映射是1M+并且在20个线程之间。这意味着你需要配速为2000万个字符串…好的,你可以做数学运算。无论如何,你可以试试看。它可能没有看起来那么糟糕。我会尝试一下…这种方法有它的优点,但不会返回地图,而是一个集合,而不是像你那样的O
comments…这个比率会像我说的那样开始,并且可能只会朝着更大的方向增长O
comments…比率将开始像我所说的那样,并且可能只会朝着更大的MCrap增长,你是对的…我使用TreeMap是因为log(n)
,但我认为我的推理是反向的(虽然存在:p)。但是,请解释一下,如果TreeMap中的排序是基于compareTo()
,HashMap没有,那么为什么HashMap会更快,因为您知道如何在树映射中搜索值,而您不知道如何在HashMap中搜索值。因此,从逻辑上讲,O(1)和O(log(n))是插入时间,而TreeMapHashMap的搜索时间必须更快。对于插入,O(1)是插入,O(1)是包含。树映射是O(log(n)是插入,O(log(n))是插入)对于包含。如果您对排序值不感兴趣,HashMap
的速度更快。我认为我无法在这篇文章中更好地解释HashMap