Java 如何从多个迭代器创建并行拆分器?

Java 如何从多个迭代器创建并行拆分器?,java,java-8,iterator,java-stream,Java,Java 8,Iterator,Java Stream,我有一个游标支持的迭代器列表,这些迭代器由执行多个数据库查询的方法返回 因为每个游标支持的迭代器在数据库上都是这样分区的,所以我也希望在结果流上利用并行流操作。为此,我想创建一个拆分器 List<Iterator<Article>> articleIterators = executeQuery(); List articleIterators=executeQuery(); 如何创建拆分器?假设每个迭代器中的项都是有序的。我的想法可能存在根本性的缺陷 更详细的背景

我有一个游标支持的迭代器列表,这些迭代器由执行多个数据库查询的方法返回

因为每个游标支持的迭代器在数据库上都是这样分区的,所以我也希望在结果流上利用并行流操作。为此,我想创建一个拆分器

List<Iterator<Article>> articleIterators = executeQuery();
List articleIterators=executeQuery();
如何创建拆分器?假设每个迭代器中的项都是有序的。我的想法可能存在根本性的缺陷



更详细的背景:我运行多个Cassandra查询,因此每个查询都会访问不同的分区。每个查询都返回自己的延迟分页迭代器。

您可以尝试使用中提供的

List iters=IntStream.range(1,32).mapToObj(it->Stream.repeat(1,it).peek(Fn.sleep(3)).toList();
long startTime=System.currentTimeMillis();
Stream.concat(iters).sumInt(Integer::intValue);
System.out.println(“take:”+(System.currentTimeMillis()-startTime));//打印输出:拍摄时间:1535
iters=IntStream.range(1,32).mapToObj(it->Stream.repeat(1,it).peek(Fn.sleep(3)).toList();
startTime=System.currentTimeMillis();
Stream.parallelcontat(iters).sumInt(Integer::intValue);
System.out.println(“take:”+(System.currentTimeMillis()-startTime));//打印输出:251

免责声明:我是。

的开发人员,如果我可以尝试(过度)简化问题,考虑到并行处理这些数据集的好处已经确立,我会做一些简单可靠的事情,很容易做到这一点(比如一个大小正确的执行者服务为每个迭代器执行一个流任务)。在我看来,试图通过一个并行流管道来运行这个过程需要一些工程来设计一个拆分迭代器,该迭代器将完全按照所需并以确定的方式对集合进行分区。@ernest_k实际上,组合流(
concat
flatMap
)倾向于在其组件上进行精确拆分,这就是这些迭代器。更大的问题是,并行流将根据CPU内核的本地数量而不是数据库分区的数量进行配置。@Holger很棒,这为OP的问题提供了一个简单的答案(除非这取决于实现-tl;dr)@欧内斯特?克:我更喜欢你的方法,告诉我适合这份工作的正确工具。
List<Stream<Integer>> iters = IntStream.range(1, 32).mapToObj(it -> Stream.repeat(1, it).peek(Fn.sleep(3))).toList();

long startTime = System.currentTimeMillis();
Stream.concat(iters).sumInt(Integer::intValue);
System.out.println("Took: " + (System.currentTimeMillis() - startTime)); // print out: Took: 1535

iters = IntStream.range(1, 32).mapToObj(it -> Stream.repeat(1, it).peek(Fn.sleep(3))).toList();

startTime = System.currentTimeMillis();
Stream.parallelConcat(iters).sumInt(Integer::intValue);
System.out.println("Took: " + (System.currentTimeMillis() - startTime)); // print out: Took: 251