Scala元组内存开销

Luk*_*asz 19 memory-management scala

什么是元组[Int,Int]的额外内存成本,即.(1,2)两个没有元组的Ints?

Rex*_*err 23

JVM开销往往是每个对象16到24个字节(分别为32位和64位,但压缩指针可以使后者更小). Tuple2是专门的Int,这意味着它将值存储在字段中,因此与8 + 16 = 24或8 + 24 = 32(1,2)相比,您有两个整数的8个字节.如果您使用类似的非专用集合(或者使用Tuple2来处理它不专门的东西,那么Char),那么您需要指向对象的指针,并且您可能需要这些对象取决于它们是否可以预先分配(任意整数) ,no;任意字节,是;任意字符,也许).如果是,那么你只需要指针,它是8 + 16 = 24或16 + 24 = 40字节; 如果不是,则需要三个对象,因此它分别为16 + 8 + 2*(16 + 4)= 64和24 + 16 + 2*(24 + 4)= 96.

底线:物体使用大量的内存比基本类型,通常是3-4倍,但有时超过10倍.如果内存不足,请尽可能多地打包到阵列中.例如:

内存使用不好:

val a = (1 to 10000).map(x => (x,x.toString.length)).toArray
Run Code Online (Sandbox Code Playgroud)

适合内存使用:

val b = ((1 to 10000).toArray, (1 to 10000).map(_.toString.length).toArray)
Run Code Online (Sandbox Code Playgroud)

如果你对内存非常紧张,那么你可以编写迭代器和其他包装器,让你将事物索引,好像它们是一个元组数组而不是一个数组元组.这有点痛苦,但如果你真的缺乏记忆力就值得.

  • @Daniel - 那是非专业版.试试`:javap -v scala.Tuple2 $ mcII $ sp`(如果你预先添加scala,它可以在REPL中运行.). (2认同)