gpt4 book ai didi

java - 并行迭代大 HashMap

转载 作者:行者123 更新时间:2023-12-01 07:18:06 25 4
gpt4 key购买 nike

我有一个链接的 HashMap ,最多可以包含 300k 条记录。我想并行迭代这个映射以提高性能。该函数迭代 vector 映射并查找给定 vector 与映射中所有 vector 的点积。还要根据日期值再进行一项检查。该函数返回一个嵌套的 HashMap 。

这是使用迭代器的代码:

public HashMap<String,HashMap<String,Double>> function1(String key, int days) {
LocalDate date = LocalDate.now().minusDays(days);
HashMap<String,Double> ret = new HashMap<>();
HashMap<String,Double> ret2 = new HashMap<>();
OpenMapRealVector v0 = map.get(key).value;
for(Map.Entry<String, FixedTimeHashMap<OpenMapRealVector>> e: map.entrySet()) {
if(!e.getKey().equals(key)) {
Double d = v0.dotProduct(e.getValue().value);
d = Double.parseDouble(new DecimalFormat("###.##").format(d));
ret.put(e.getKey(),d);
if(e.getValue().date.isAfter(date)){
ret2.put(e.getKey(),d);
}
}
}
HashMap<String,HashMap<String,Double>> result = new HashMap<>();
result.put("dot",ret);
result.put("anomaly",ret2);
return result;
}

更新:我研究了 Java 8 流,但在使用并行流时遇到了 CastException 和 Null 指针异常,因为此映射正在其他地方进行修改。

代码:

public HashMap<String,HashMap<String,Double>> function1(String key, int days) {
LocalDate date = LocalDate.now().minusDays(days);
HashMap<String,Double> ret = new HashMap<>();
HashMap<String,Double> ret2 = new HashMap<>();
OpenMapRealVector v0 = map.get(key).value;
synchronized (map) {
map.entrySet().parallelStream().forEach(e -> {
if(!e.getKey().equals(key)) {
Double d = v0.dotProduct(e.getValue().value);
d = Double.parseDouble(new DecimalFormat("###.##").format(d));
ret.put(e.getKey(),d);
if(e.getValue().date.isAfter(date)) {
ret2.put(e.getKey(),d);
}
}
});
}
}

我已经同步了 map 使用,但仍然出现以下错误:

java.util.concurrent.ExecutionException: java.lang.ClassCastException
Caused by: java.lang.ClassCastException
Caused by: java.lang.ClassCastException: java.util.HashMap$Node cannot be cast to java.util.HashMap$TreeNode

另外,我在想我应该将 map 分成多个部分并使用不同的线程并行运行每个部分吗?

最佳答案

您需要检索Set<Map.Entry<K, V>>从 map 上。

以下是在 Java8 中使用并行流在 Map 上进行迭代的方法:

Map<String, String> myMap = new HashMap<> ();
myMap.entrySet ()
.parallelStream ()
.forEach (entry -> {
String key = entry.getKey ();
String value = entry.getValue ();
// here add whatever processing you wanna do using the key / value retrieved
// ret.put (....);
// ret2.put (....)
});

澄清:

map retret2应声明为 ConcurrentHashMap s 允许多个线程并发插入/更新。

因此这两个映射的声明变为:

Map<String,Double> ret = new ConcurrentHashMap<> ();
Map<String,Double> ret2 = new ConcurrentHashMap<> ();

关于java - 并行迭代大 HashMap ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51067866/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com