4

调用groupedScalaStream似乎会将整个流缓冲到内存中。我在这里挖了很多东西来确定哪个类持有对 Stream 头部的引用。

一个简单的例子:

lazy val stream1: Stream[Int] = {
  def loop(v: Int): Stream[Int] = v #:: loop(v + 1)
  loop(0)
}

stream1.take(1000).grouped(10).foreach(println)

如果运行此代码并在foreach函数中放置一个断点,则可以看到在 Stream 的头部被绘制时有一个引用。

经过多次迭代,内存中仍然存在对 Stream 早期“块”的引用: 几次迭代后在内存中流式传输 Cons

此外,如果我们检查对 Stream 头部的引用,我们可以看到 IterableLike 中的一些 lambda 持有一个引用。

在此处输入图像描述

grouped上调用时Stream,Collections 库首先调用,返回 a ,然后在迭代器上调用,返回iteratora 。上面的屏幕截图表明,内部的某些东西似乎抓住了 Stream 的头部,但我无法确定是什么。StreamStreamIteratorgroupedGroupedIteratorGroupedIterator

我的问题是双重的: 1. 这是 Scala Streams 的预期行为吗?如果不是,在 StreamIterator 和 GroupedIterator 的实现中发生了什么导致 Stream 的头部在运行.grouped(N)时被保留Stream

4

0 回答 0