我正在使用 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/