【发布时间】:2018-11-19 14:51:32
【问题描述】:
当我在不可变集合中添加元素时,我会在循环中耗尽内存。集合中已经有很多对象,我想它会消耗大量内存。我知道在不可变集合中添加元素时,Scala 会首先将现有集合复制到新集合中,然后将元素添加到新集合中并返回这个新集合。
所以假设我的 JVM 内存是 500mb,而这个集合消耗了 400mb。现在,在添加新元素之前,Scala 尝试将旧集复制到新集(我认为这将再次消耗 400mb)现在在这一步,它已经超过了 JVM 内存(总消耗内存 800),因此它会抛出内存不足错误。 代码看起来有点像下面
private def getNewCollection(myMuttableSet:Set[MyType]): Set[MyType] = {
myMuttableSet.flatMap(c => {
val returnedSet = doSomeCalculationsAndreturnASet // this method returns a large collection so duing the loop the collection grows exponentially
if (returnedSet.isEmpty) Set.empty[MyType]
else doSomeCalculationsAndreturnASet + MyType(constArg1,constArg2) (I have case class of MyType)
})
}
如果我的理解正确,请告知。
【问题讨论】:
-
能否在问题中包含循环代码?
-
你的理解是正确的
-
是的,你是对的,但很高兴看到你的代码,因为如果你正在做类似的事情:
var set = Set.empty[Int]; for (i <- 1 to 1000) { set = set + i},那么,恕我直言,最好只使用@987654321 @. -
mutable val与immutable var之间的偏好应该部分取决于可见性。请参阅stackoverflow.com/a/11386867/3226045 了解有关引用透明度的说明。 -
添加了程序中使用的算法
标签: scala collections garbage-collection out-of-memory