scala stream.grouped将整个流缓冲到内存中

fhg3lkii  于 2021-07-14  发布在  Java
关注(0)|答案(0)|浏览(181)

打电话 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 ,集合库首先调用 iteratorStream ,返回 StreamIterator 然后 grouped 在迭代器上,返回 GroupedIterator . 上面的截图显示 GroupedIterator 似乎抓住了溪流的源头,但我无法确定是什么。
我的问题有两个:1。这是scala流的预期行为吗?如果不是,那么streamiterator和groupediterator的实现中发生了什么,导致在运行时保留流的头 .grouped(N)Stream ?

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题