簡體   English   中英

Scala流將中間對象保留在內存中

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM