我想分手了大量的数据,例如,有没有办法使用它像这样(在Java中):有没有办法在Java中并行拆分和连接多个数据?
idList.parallelStream()
.splitCount(20)
.eachMap((splitedIdList) -> dao.list(splitedIdList))
.aggregate()
.collect(Collectors.toList());
有没有办法来解决这个问题是使用流还是其他图书馆?
我想分手了大量的数据,例如,有没有办法使用它像这样(在Java中):有没有办法在Java中并行拆分和连接多个数据?
idList.parallelStream()
.splitCount(20)
.eachMap((splitedIdList) -> dao.list(splitedIdList))
.aggregate()
.collect(Collectors.toList());
有没有办法来解决这个问题是使用流还是其他图书馆?
虽然@Kayaman的言论非常相关,但我认为你要找的是java.util.Spliterator<T>
。
用于遍历和分区源元素的对象。由Spliterator覆盖的元素的源可以是例如 阵列,集合,IO通道或生成器函数。
Spliterator可以批量地逐个遍历元素(tryAdvance())或 (forEachRemaining())。
甲Spliterator也可以在分区关闭它的一些元件(使用 trySplit)作为另一Spliterator,以便在可能的并行 操作中使用。使用不能分割的Spliterator进行操作,或者如果以高度不平衡或低效的方式进行操作,则不太可能从并行性中受益。穿越和分裂排气元件; 每个Spliterator仅适用于单个批量计算。
该类的JavaDoc非常复杂,包括一个关于如何实现和使用Spliterator
的示例。
下面是一个简单的解决方案我fork on SteamEx
StreamEx.of(idsList).parallel()
.splitToList(100)
.flatCollection(ids -> dao.list(ids)) // assume dao.list(...) returns a list of records, you can switch to flatArray/flatMap per the return type of dao.list
.toList();
更新: 我做了一些性能测试的OP下的意见:(单位为毫秒)
大小的id list:100,1000,10_000
全部一项查询:3.5,6.9,282.2
通过批量(200)3.5,4.8,186.0
一个接一个:7.8,35.5,572.9
基于MySQL的5.7和我个人的经验性能测试结果,我会说:
1,如果只有几个ID,也许可以逐个查询。
2,如果有数百/数千甚至更多,批处理或全部在一个查询是必要的。
3,如果你想在一个语句来执行所有ID的查询,请注意:
一)限制是1000甲骨文,8623 for SQL server
b)在限制不意味着数据库被调整为最大能力。
C)可能需要很长时间来执行大的查询和数据库可以通过长的查询
d),超时或在数据包大小而告终。
你可以使用'dao :: list'而不是'ids - > dao.list(id)'。 – shmosel
用于“个人体验”的Downvoted。如果你知道你需要获取多行,那么一个接一个地查询也是不行的。至于你的情况'b)',如果你暗示它不那么有效,你将不得不提供一些证据。 c和d一样。有关Oracle的示例案例,请参阅[这里](https://stackoverflow.com/questions/22797896/what-are-the-performance-implications-of-oracle-in-clause-with-no-joins)。如果您进行性能测试,您需要显示代码和设置,查询计划,否则我们不能相信您正确测试。 – Kayaman
我并不是想让你满意,但是这个答案价值不大,并且提供了错误的解决方案。例如,在MySQL中最大数据包大小是可配置的,除非规划器发生错误(这意味着您在配置中发生错误),否则执行大型查询不会比多个小型查询花费更长的时间。数据库变得聪明已经有数百年的时间了,你的个人经验并没有成功。 – Kayaman
当然,但你为什么要这样做?假设你的dao访问数据库,所以并行执行并不会提高性能。它会伤害它。 – Kayaman
DUPE https://stackoverflow.com/questions/27583623/is-there-an-elegant-way-to-process-a-stream-in-chunks – tbsalling
@Kayaman谢谢,就我而言,'idList'很大(最大10,000)和'dao.list()'的sql是'SELECT * FROM table WHERE id IN(...)'。在这种情况下它不会提高性能吗? –