如何估计scala中数据结构的大小?

Squ*_*dly 6 performance jvm scala

我有一个查询返回大约600万行,这太大了,无法在内存中同时处理所有行.

每个查询都返回一个Tuple3 [String,Int,java.sql.Timestamp].我知道字符串绝不会超过20个字符,UTF8.

我如何计算出这些元组之一的最大大小,更一般地说,我如何估计这样的scala数据结构的大小?

我正在使用的机器上有6Gb.但是,使用scala-query从scala的列表中读取数据.

Rex*_*err 6

Scala对象遵循与Java对象大致相同的规则,因此有关这些对象的任何信息都是准确的. 这是一个来源,似乎至少大部分都适用于32位JVM.(64位JVM每个指针使用8个字节,这通常可以达到4个字节的额外开销加上每个指针4个字节 - 但是如果JVM使用压缩指针可能会少一些,我认为现在默认情况下会这样做.)

我假设没有压缩指针的64位机器(最坏的情况); 然后a Tuple3有两个指针(16个字节)加一个Int(4个字节)加上对象开销(~12个字节)四舍五入到最接近的8个或32个字节,加上一个额外的对象(8个字节)作为非专用版本的存根的Int.(遗憾的是,如果在元组中使用基元,它们比使用包装版本时占用的空间更多.) String是32字节,IIRC,加上数据的数组,每个字符16加2. java.sql.Timestamp需要存储几个Longs(我认为是),所以这是32个字节.总而言之,它是120字节的顺序加上每个字符两个,其中~20个字符是~160字节.

或者,请参阅此答案以获取直接测量对象大小的方法.当我以这种方式测量它时,我得到160个字节(并且上面的估计已使用此数据进行了校正,因此它匹配;之前我有几个小错误).