Tuple [Int,Int]的额外存储成本是多少? (1,2)超过两个没有元组的整数?
最佳答案
每个对象的JVM开销通常为16到24个字节(分别为32位和64位,尽管压缩指针可使后者更小)。 Tuple2
专门用于Int
,这意味着它将值存储在字段中,因此对于两个整数,您有8个字节,而对于(1,2),则为8 + 16 = 24或8 + 24 = 32。如果您使用类似的非专用集合(或将Tuple2用于非专用集合,例如Char
),则需要指向对象的指针,并且可能需要取决于是否可以预分配对象的对象(任意整数,否;任意字节,是;任意字符,也许)。如果是,则只需要指针,它是8 + 16 = 24或16 + 24 = 40字节;如果否,则需要三个对象,因此分别为16 + 8 + 2 *(16 + 4)= 64和24 + 16 + 2 *(24 + 4)= 96。
底线:与基本类型相比,对象使用更多的内存,通常为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)
如果您真的很紧的内存,那么可以编写迭代器和其他包装器,使您可以将事物索引为元组数组而不是数组元组。这有点痛苦,但是如果您真的内存不足,那是值得的。
关于scala - Scala元组内存开销,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6916843/