scala - Scala元组内存开销

标签 scala memory-management

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/

相关文章:

Java如何限制作用于方法的线程数量

c - 为什么我不能使用 "fgets"将字符串读取到我的结构元素中?

c - 让两个指针指向同一个内存块的正确方法

java - 类型不匹配,预期 util.List[Nothing] 从 java 到 scala

scala - 更新插入到 Apache Spark 中的 Phoenix 表

python - Scala相当于python echo服务器/客户端示例?

scala - 用 Maven 创建最基本的 Scala 项目?

存储在共享内存中的 C++ 对象(volatile 成员函数?)

java - 为什么 Spark 在本地模式下失败并显示 "Failed to get broadcast_0_piece0 of broadcast_0"?

objective-c - 在 Objective-C 中保留 block 中的可变变量而不引起循环引用