2017-10-09 74 views
0

我想分手了大量的数据,例如,有没有办法使用它像这样(在Java中):有没有办法在Java中并行拆分和连接多个数据?

idList.parallelStream() 
    .splitCount(20) 
    .eachMap((splitedIdList) -> dao.list(splitedIdList)) 
    .aggregate() 
    .collect(Collectors.toList()); 

有没有办法来解决这个问题是使用流还是其他图书馆?

+3

当然,但你为什么要这样做?假设你的dao访问数据库,所以并行执行并不会提高性能。它会伤害它。 – Kayaman

+0

DUPE https://stackoverflow.com/questions/27583623/is-there-an-elegant-way-to-process-a-stream-in-chunks – tbsalling

+1

@Kayaman谢谢,就我而言,'idList'很大(最大10,000)和'dao.list()'的sql是'SELECT * FROM table WHERE id IN(...)'。在这种情况下它不会提高性能吗? –

回答

0

虽然@Kayaman的言论非常相关,但我认为你要找的是java.util.Spliterator<T>

用于遍历和分区源元素的对象。由Spliterator覆盖的元素的源可以是例如 阵列,集合,IO通道或生成器函数。

Spliterator可以批量地逐个遍历元素(tryAdvance())或 (forEachRemaining())。

甲Spliterator也可以在分区关闭它的一些元件(使用 trySplit)作为另一Spliterator,以便在可能的并行 操作中使用。使用不能分割的Spliterator进行操作,或者如果以高度不平衡或低效的方式进行操作,则不太可能从并行性中受益。穿越和分裂排气元件; 每个Spliterator仅适用于单个批量计算。

该类的JavaDoc非常复杂,包括一个关于如何实现和使用Spliterator的示例。

-1

下面是一个简单的解决方案我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),超时或在数据包大小而告终。

+0

你可以使用'dao :: list'而不是'ids - > dao.list(id)'。 – shmosel

+0

用于“个人体验”的Downvoted。如果你知道你需要获取多行,那么一个接一个地查询也是不行的。至于你的情况'b)',如果你暗示它不那么有效,你将不得不提供一些证据。 c和d一样。有关Oracle的示例案例,请参阅[这里](https://stackoverflow.com/questions/22797896/what-are-the-performance-implications-of-oracle-in-clause-with-no-joins)。如果您进行性能测试,您需要显示代码和设置,查询计划,否则我们不能相信您正确测试。 – Kayaman

+0

我并不是想让你满意,但是这个答案价值不大,并且提供了错误的解决方案。例如,在MySQL中最大数据包大小是可配置的,除非规划器发生错误(这意味着您在配置中发生错误),否则执行大型查询不会比多个小型查询花费更长的时间。数据库变得聪明已经有数百年的时间了,你的个人经验并没有成功。 – Kayaman

相关问题