[英]Scala stream keeps intermediary objects in memory
我正在嘗試在Scala中編寫Stream,但我不明白為什么它會在內存中保留一些中間對象(並最終導致內存不足)。
這是我的代碼的簡化版本:
val slols = {
def genLols (curr:Vector[Int]) :Stream[Int] = 0 #:: genLols(curr map (_ + 1))
genLols(List.fill(1000 * 1000)(0).toVector)
}
println(slols(1000))
這似乎保留在中間curr
,我不明白為什么。
這是用迭代器編寫的相同代碼(更好的內存消耗):
val ilols = new Iterator [Int] {
var curr = List.fill(1000 * 1000)(0).toVector
def hasNext = true
def next () :Int = { curr = curr map (_ + 1) ; 0 }
}
val silols = ilols.toStream
println(silols(1000))
編輯:我有興趣在內存中保留0
s,我的目標是不保留curr
因為它們對於采取計算步驟很有用(在我的簡化示例中可能並不明顯)。 而且僅憑0
就不會造成內存不足錯誤(它們存儲起來並不那么繁重)。
當您將流分配給變量時,可以防止其頭部被垃圾回收。
在第一種情況下,意味着每次迭代的cur
Vector的所有引用都被記憶。
在第二種情況下,情況更好,因為迭代器一次只存儲cur
的一個實例。 但是仍然會記住流中的所有Int
元素。
如果不需要記憶,請嘗試用def slols
替換val slols
。
順便說一句,就邏輯而言,您的兩個示例並不相同(可能您已經意識到了)。
查看本文以了解詳細信息。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.