我正在使用.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;
}
Java中是否有等效的combinable<>
类?
Java code snippet:
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引用)
答案 0 :(得分:2)
Spark中的正确工具是Accumulator
:
Accumulator<Integer> accum = sc.accumulator(0);
myRDD.parallelStream().forEach(
accum.add(1);
);
accum.value();
累加器从工作者的角度来看是只写的,只能由驱动程序读取。默认情况下,它仅支持Long
,Double
和Float
,但您可以实现自定义AccumulatorParam
以支持其他类型。