首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >显示Java 8流处理的进度

显示Java 8流处理的进度
EN

Stack Overflow用户
提问于 2018-06-10 23:57:42
回答 2查看 3.9K关注 0票数 31

我有一个处理几百万个元素的Stream。它背后的Map-Reduce算法需要几毫秒,因此任务完成大约需要20分钟。

代码语言:javascript
复制
Stream<MyData> myStream = readData();
MyResult result = myStream
    .map(row -> process(row))
    .peek(stat -> System.out.println("Hi, I processed another item"))
    .reduce(MyStat::aggregate);

我想要一种显示整体进度的方法,而不是为每个元素打印一行(这会导致每秒数千行,需要时间,并且不能提供任何有关整体进度的有用信息)。我想展示一些类似的东西:

代码语言:javascript
复制
 5% (08s)
10% (14s)
15% (20s)
...

最好(和/或最简单)的方法是什么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-06-11 00:17:27

首先,流并不是用来完成这类任务的(与传统的数据结构相反)。如果你已经知道你的流将处理多少元素,你可以选择以下选项,我重复一遍,这不是流的目标。

代码语言:javascript
复制
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);
票数 18
EN

Stack Overflow用户

发布于 2018-06-11 00:05:21

这样做的可能性在很大程度上取决于您在stream中拥有的source类型。如果你有一个集合,并且你想要对它应用一些操作,你可以这样做,因为你知道这个集合的大小,并且你可以对处理过的元素进行计数。但在这种情况下也有一个警告。如果你要在流中进行并行计算,这也会变得更加困难。

在您从应用程序外部流式传输数据的情况下,您很难对进度建模,因为您不知道流将何时结束。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50785508

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档