【问题标题】:Parallel Stream Hash Sets并行流哈希集
【发布时间】:2018-06-24 23:25:54
【问题描述】:

我在 Java 8 中有以下问题编程。HashSet“mySet”通常包含数千个整数,是我程序的瓶颈。它经常执行。加速它会导致执行时间更快。

void doStuff(int val){
    for (int i : mySet) {
        if (val > limits)
            alpha = arrayA[i] + arrayB[val];
        else
            alpha = arrayK[i][val] + arrayA[i] + arrayB[val];

        if (cmpArray[i] > alpha) {
            cmpArray[i] = alpha;
            arrayC[i] = val;
        }
        if (alpha == 0) {
            zeroSet.add(i);
        }
    }
}

我尝试使用并行流来更快地完成这项工作:

void doStuff(int val){
    if (val > limits)
            mySet
           .parallelStream()
           .filter(p -> this.cmpArray[p] > -(arrayA[p] + arrayB[val]))
           .forEach(p -> op(p, val, -(arrayA[p] + arrayB[val])));
        else
            mySet
           .parallelStream()
           .filter(p -> this.alpha[p] > arrayK[p][val] - arrayA[p] - arrayB[val])
           .forEach(p -> op(p, val, arrayK[p][val] - arrayA[p] - arrayB[val]));

    for (int i : mySet()) { 
        if (arrayA[i] == 0) {
            zeroSet.add(i); 
        }
    }

void op(int p, int val, int alpha){
    cmpArray[p] = alpha;
    arrayC[p] = val;
}

我无法并行化 HashSet-Function add()。这导致了一些奇怪的结果。谁能给我一个关键字,为了了解发生了什么,要寻找什么?有没有机会并行化这段代码?

我不想让你为我解决问题,只是为了检查我是否在正确的轨道上:-D

感谢您的回复。

最好的,山姆

【问题讨论】:

标签: java parallel-processing java-stream hashset


【解决方案1】:

请注意,HashSet 实现不是线程安全的。多线程添加元素会破坏数据集。

documentation

为了使循环并行化,必须创建一个新的 Set。

替换

for (int i : mySet()) { 
    if (arrayA[i] == 0) {
        zeroSet.add(i); 
    }
}

zeroSet = mySet
      .parallelStream()
      .filter(i -> arrs[i] == 0)
      .collect(Collectors.toSet());

希望这会有所帮助:)

【讨论】:

    猜你喜欢
    • 2012-02-26
    • 2016-02-22
    • 2023-03-31
    • 2010-11-30
    • 1970-01-01
    • 1970-01-01
    • 2014-01-24
    • 2019-12-20
    • 2019-02-14
    相关资源
    最近更新 更多