减少Scala对象的内存分配

时间:2017-11-30 22:14:32

标签: scala

我想针对内存性能优化以下代码:

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来检查对象的大小。

1 个答案:

答案 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的新实例。只有引用才会被放入容器中。