我有一个Stream
处理数百万个元素。其背后的Map-Reduce算法需要几毫秒,因此任务完成大约需要二十分钟。
Stream<MyData> myStream = readData();
MyResult result = myStream
.map(row -> process(row))
.peek(stat -> System.out.println("Hi, I processed another item"))
.reduce(MyStat::aggregate);
我想要一种显示总体进度的方法,而不是每个元素打印一行(这会导致每秒数千行,需要时间并且不提供有关总体进度的任何有用信息)。我想显示类似的内容:
5% (08s)
10% (14s)
15% (20s)
...
最好的(和/或最简单的)方法是什么?
首先,流并不是为了实现此类任务(与经典数据结构相反)。如果您已经知道流将处理多少元素,您可能会选择以下选项,我重复一遍,这不是流的目标。
Stream<MyData> myStream = readData();
final AtomicInteger loader = new AtomicInteger();
int fivePercent = elementsCount / 20;
MyResult result = myStream
.map(row -> process(row))
.peek(stat -> {
if (loader.incrementAndGet() % fivePercent == 0) {
System.out.println(loader.get() + " elements on " + elementsCount + " treated");
System.out.println((5*(loader.get() / fivePercent)) + "%");
}
})
.reduce(MyStat::aggregate);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)