打电话 grouped
在scala上 Stream
似乎把整个流缓冲到内存中。我在这里挖了很多来确定哪个类持有对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
函数,可以看到在流被抽出时,有一个引用被保持在流的头部。
经过几次迭代后,内存中仍然存在对流的早期“块”的引用:
此外,如果我们检查流头的引用,我们可以看到iterablelike中的一些lambda持有一个引用。
什么时候 grouped
是在 Stream
,集合库首先调用 iterator
上 Stream
,返回 StreamIterator
然后 grouped
在迭代器上,返回 GroupedIterator
. 上面的截图显示 GroupedIterator
似乎抓住了溪流的源头,但我无法确定是什么。
我的问题有两个:1。这是scala流的预期行为吗?如果不是,那么streamiterator和groupediterator的实现中发生了什么,导致在运行时保留流的头 .grouped(N)
在 Stream
?
暂无答案!
目前还没有任何答案,快来回答吧!