我想针对内存性能优化以下代码:
import com.madhukaraphatak.sizeof.SizeEstimator
object PlayGround extends App {
val intSize = 100000
case class VeryBigObj(int: List[Int])
case class SimpleRels[N,E](nodes:Set[N], edges:Map[(N,N), E])
val n0 = VeryBigObj(List.fill(intSize)(Random.nextInt))
val n1 = VeryBigObj(List.fill(intSize)(Random.nextInt))
val n2 = VeryBigObj(List.fill(intSize)(Random.nextInt))
val sg = SimpleRels(Set(n0, n1, n2), Map((n0, n1) -> "n0--n1", (n1, n2) -> "n1--n2"))
println(s"size of n0 ${SizeEstimator.estimate(n0)}")
println(s"size of (n0, n1) ${SizeEstimator.estimate((n0, n1))}")
println(s"size of Set(n0, n1, n2) ${SizeEstimator.estimate(Set(n0, n1, n2))}")
println(s"size of sg ${SizeEstimator.estimate(sg)}")
}
//output
size of n0 4800032
size of (n0, n1) 9600072
size of Set(n0, n1, n2) 14400096
size of sg 14400312
假设VeryBigObj
内存占用非常大。在SimpleRels
中,我希望有一个包含一堆这些对象的集合和另一个包含这些对象之间某种关系的Map。据我所知(我可能错了),Scala为元组和Set和Map创建了新的不可变对象,并没有指向已经定义的不可变变量(我是对的吗?)。如何更改rels
以便它只包含指向这些变量的指针并减少此对象的内存占用量?
编辑:我使用SizeEstimator来检查对象的大小。
答案 0 :(得分:3)
与C / C ++相比,Java / Scala容器只存储引用。
在显示的代码中,VeryBigObj
只会由new VeryBigObj
创建(如果是new
,则case class
可以省略。)
仅以下代码创建VeryBigObj
:
val n0 = new VeryBigObj(0)
val n1 = new VeryBigObj(1)
val n2 = new VeryBigObj(2)
将它们放在容器中不会复制或创建VeryBigObj
的新实例。只有引用才会被放入容器中。