java - 为什么使用 Java 的流 API 收集器进行管道分组需要更多时间?

标签 java performance java-8 java-stream

我正在使用 Stream API 从列表中创建 map 的 map 。列表包含 1000 万条记录。我已经使用如下两个“groupingBy”操作通过单个语句完成了此操作。问题是这一行语句的执行时间将近 1.5 分钟,这成为我的性能关键型应用程序执行的瓶颈。

我在下面使用并行流 API 给出了我尝试过的代码

Map<MyKey, Map<String, List<Person>>> personMap = personList.parallelStream()
    .collect(Collectors.groupingBy(
        person -> new MyKey(person.Id(), person.getPricePointId()),
        Collectors.groupingBy(Person::getWorkType)));

执行上述代码需要 1.5 多分钟,几乎占我总执行时间的 75%。我没有找到比这更快的其他解决方案。所以我的问题是,对于这么多数据,这是最大可能的吞吐量吗?或者在这里使用下游(多个 groupingBy)不是正确的选择?如果不是,减少执行时间的正确方法应该是什么?

最佳答案

你正在做的是一个坏主意查询 1000 万条记录需要大量内存 因此,将您的查询分组为限制和起点,并根据限制和起点划分查询,并在单独的线程中运行每个查询,最后加入线程。对于您的用例,它会更快更高效

关于java - 为什么使用 Java 的流 API 收集器进行管道分组需要更多时间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56576707/

相关文章:

Java 8 流 : The method boxed() is undefined for the type Stream<Byte>

java - 将 Instant 格式化为 String 时出现 UnsupportedTemporalTypeException

java - 为什么我不能公开枚举的内部类?

java - 使用最新的 Sun JVM(1.6),是否有可能获得 GC 线程信息?

java - 禁用日历对象中的时区区域

java - 帮助使用可重用的 JPA 事务方法(带回滚)

javascript - 你在什么时候进行前端优化?

java - java inputstream 可以读取正在内存中更新的文件吗?

c# - 检测列表中日期重叠的算法

sql - 慢 SQL 查询 : using the same table in two different joins causes query to become 10x slower!