gpt4 book ai didi

java - Java有没有类似于c++的combinable?

转载 作者:行者123 更新时间:2023-11-28 02:19:30 25 4
gpt4 key购买 nike

我正在使用 .parallelStream().forEach()对数据库进行大量写入,但也想记录我写入的行数。

现在,我有一个 java.util.concurrent.atomic.AtomicInteger跟踪计数,但我想使用类似于 C++ 的 combinable<> 的东西.

this article , 有一个使用 combinable<> 的例子:

#include <iostream>
#include <cstdint>
#include <ppl.h>

using namespace Concurrency;

const int max_sum_item = 1000000000;

int main()
{
combinable<uint64_t> part_sums([] { return 0; });

parallel_for(0, max_sum_item,
[&part_sums] (int i)
{
part_sums.local() += i;
}
);

uint64_t result = part_sums.combine(std::plus<uint64_t>());

if (result != uint64_t(499999999500000000))
throw;
}

有没有等价的combinable<> Java 中的类?

Java 代码片段:

AtomicInteger totalRows = new AtomicInteger(0);
...
myList.parallelStream().forEach(
... // write to db
totalRows.addAndGet(rowsWritten);
...
);

print(totalRows.get());

寻找类似的东西:

Combinable<int> totalRows = new Combinable<>(0);
...
myList.parallelStream().forEach(
... // write to db
totalRows = rowsWritten;
...
);

print(totalRows.combine());

编辑:根据@zero323,Spark 中正确的工具是 Accumulator 。 .我对多线程案例更感兴趣,但手头没有非 Spark 示例。

EDIT2:更新示例(并删除 Spark 引用)

最佳答案

Spark 中的正确工具是 Accumulator :

Accumulator<Integer> accum = sc.accumulator(0);

myRDD.parallelStream().forEach(
accum.add(1);
);

accum.value();

从 worker 的角度来看,累加器是只写的,只能由驱动程序读取。默认情况下,它仅支持 LongDoubleFloat,但您可以实现自定义 AccumulatorParam 以支持其他类型。

关于java - Java有没有类似于c++的combinable?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33039689/

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