元组[Int,Int]的额外内存成本是多少。 (1,2)两个没有元组的Ints?
答案 0 :(得分:22)
JVM开销往往是每个对象16到24个字节(分别为32位和64位,但压缩指针可以使后者更小)。 Tuple2
专门用于Int
,这意味着它将值存储在字段中,因此对于两个整数,您有8个字节,而8 + 16 = 24或8 + 24 = 32(1,2) )。如果你使用类似的非专业集合(或者使用Tuple2来处理它不专门的东西,比如Char
),那么你需要指向对象的指针,而你可能需要这些对象取决于它们是否可以预先分配(任意整数,不;任意字节,是;任意字符,也许)。如果是,那么你只需要指针,它是8 + 16 = 24或16 + 24 = 40字节;如果不是,则需要三个对象,因此它分别为16 + 8 + 2 *(16 + 4)= 64和24 + 16 + 2 *(24 + 4)= 96。
底线:对象使用 lot 比基本类型更多的内存,通常是3-4x,但有时超过10x。如果内存不足,请尽可能多地打包到阵列中。例如:
内存使用不好:
val a = (1 to 10000).map(x => (x,x.toString.length)).toArray
适合内存使用:
val b = ((1 to 10000).toArray, (1 to 10000).map(_.toString.length).toArray)
如果你对内存非常紧张,那么你可以编写迭代器和其他包装器,让你将事物编入索引,好像它们是一个元组数组而不是一个数组元组。这有点痛苦,但如果你真的很缺乏记忆,那就值得了。