调用grouped
ScalaStream
似乎会将整个流缓冲到内存中。我在这里挖了很多东西来确定哪个类持有对 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 早期“块”的引用:
此外,如果我们检查对 Stream 头部的引用,我们可以看到 IterableLike 中的一些 lambda 持有一个引用。
在grouped
上调用时Stream
,Collections 库首先调用,返回 a ,然后在该迭代器上调用,返回iterator
a 。上面的屏幕截图表明,内部的某些东西似乎抓住了 Stream 的头部,但我无法确定是什么。Stream
StreamIterator
grouped
GroupedIterator
GroupedIterator
我的问题是双重的: 1. 这是 Scala Streams 的预期行为吗?如果不是,在 StreamIterator 和 GroupedIterator 的实现中发生了什么导致 Stream 的头部在运行.grouped(N)
时被保留Stream
?