java 8流中同时有多少个项目?

问题描述 投票:-1回答:3

我正在使用SpringDataCouchbase执行一个查询,该查询同时检索很多项目(大约8k个文档),这在我需要执行的某些过程之后导致Java堆异常。我认为存储库(Streaming query Results)提供的Stream返回类型将对我有所帮助,因为它不会同时加载所有文档,但是现在我有些疑问:

  • [Stream中同时处理多少个项目?仅1个(听起来效率低下)?或者更多?
  • 有保修吗?
  • 如何确定给定时间的物品数量?
  • 使用Stream类型作为Couchbase的返回值,我可以按顺序检索整个DB(数百万个文档)吗?

感谢您的帮助。

java spring-boot java-stream couchbase spring-data-couchbase
3个回答
0
投票

默认情况下,Java流按顺序处理,一次处理。但是,可以使用parallel()方法获得并行流。

参见此Java Tutorial on Parallism


0
投票

-流中同时处理多少个项目?仅1个(听起来效率低下)?或更多?

Java 8流提供了顺序和并行处理,如javadoc(https://docs.oracle.com/javase/8/docs/api/java/util/stream/Stream.html)中所述。

如果顺序使用它,它将一次处理一个项目,但是如果使用.parallelStream(),则可以同时处理多个项目。默认情况下,并行流使用ForkJoinPool作为执行程序,其线程数与处理器中的内核数相同。 (如果启用了超线程,则为两次)。有关更多详细信息,请参见ForkJoinPool Javadoc:https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ForkJoinPool.html

-有保修吗?除了Javadoc中写的以外,我不知道您想要什么样的担保。

-如何确定给定时间的物品数量?您真的不能,整个流的概念是对信号来时作出反应。您可以限制总数,可以跳过信号,但是您无法事先知道将发射多少个信号。您将必须查看Couchbase实现,以查看它是否有任何特定方式来告诉您如何对结果进行分页以及给定时间内的项目计数。

-使用Stream类型作为Couchbase的返回值,是否可以按顺序检索整个DB(数百万个文档)?

流可以是有序的,也可以是无序的,这取决于它们的创建方式。例如,List.stream()创建一个有序流,而Set.stream()创建一个无序流。同样,如果您需要与parallelStream一起订购,则并行性的性能增益可能会降低。

检查有关订购的文档的此部分:https://docs.oracle.com/javase/8/docs/api/java/util/stream/package-summary.html#Ordering


0
投票
  • [Stream中同时处理多少个项目?仅1个(听起来效率低下)?或更多?

1,如果您不使用并行流。

  • 有保修吗?

是。在Stream的API文档中:https://docs.oracle.com/en/java/javase/12/docs/api/java.base/java/util/stream/Stream.html

  • 如何确定给定时间的物品数量?

你不能。您可以调用stream.count()获得元素数量。但是该调用是终端操作,将关闭流。

  • 使用Stream类型作为Couchbase的返回值,我可以按顺序检索整个DB(数百万个文档)吗?

理论上是。但是更好的方法将是使用弹簧数据反应式。例如:https://github.com/spring-projects/spring-data-examples/tree/master/couchbase/reactive

© www.soinside.com 2019 - 2024. All rights reserved.