Jay*_*ker 4 memory iterator scala
在Scala 2.9.1中,这很好用:
scala> (1 to Int.MaxValue).sum
res6: Int = -1073741824
Run Code Online (Sandbox Code Playgroud)
但是这会耗尽堆空间:
scala> (1 to Int.MaxValue).toIterator.sum
java.lang.OutOfMemoryError: GC overhead limit exceeded
Run Code Online (Sandbox Code Playgroud)
但令人抓狂的是,这有效:
scala> (1 to Int.MaxValue).iterator.sum
res8: Int = -1073741824
Run Code Online (Sandbox Code Playgroud)
为什么这些会有所不同?
toIterator定义TraversableLike如下
def toIterator: Iterator[A] = toStream.iterator
Run Code Online (Sandbox Code Playgroud)
所以它Stream在后台创建一个在迭代时将所有元素保存在内存中的东西.
(编辑:我认为流结构实际上并不是问题所在.但是,toStream它本身会调用toBuffer它来复制每个值.)
iterator另一方面,定义了IndexedSeqLike使用不在存储器中保留任何元素的专用结构.