Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Performance 如何在scala中近似计算数据结构的大小?_Performance_Scala_Jvm - Fatal编程技术网

Performance 如何在scala中近似计算数据结构的大小?

Performance 如何在scala中近似计算数据结构的大小?,performance,scala,jvm,Performance,Scala,Jvm,我有一个查询返回了大约600万行,太大了,无法在内存中一次处理所有行 每个查询都返回一个Tuple3[String,Int,java.sql.Timestamp]。我知道字符串永远不会超过20个字符,UTF8 如何计算其中一个元组的最大大小,更一般地说,如何计算类似这样的scala数据结构的大小 我正在使用的机器上有6Gb。但是,使用scala查询将数据从数据库读取到scala的列表中。您有多少内存可供使用?六百万个三元组的实例真的不多 每个引用都有4或8字节的开销,这取决于您运行的是32位还是

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

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

如何计算其中一个元组的最大大小,更一般地说,如何计算类似这样的scala数据结构的大小


我正在使用的机器上有6Gb。但是,使用scala查询将数据从数据库读取到scala的列表中。

您有多少内存可供使用?六百万个三元组的实例真的不多

每个引用都有4或8字节的开销,这取决于您运行的是32位还是64位(没有压缩的“oops”,尽管这是JDK7中32Gb以下堆的默认值)

因此,您的三元组有3个参考(由于专业化,可能会有额外的参考-因此您可能会得到4个参考),您的
时间戳
是一个围绕
(8字节)的包装器(参考)。您的
Int
将被专门化(即基础
Int
),因此这将产生另外4个字节。字符串是20 x 2字节。因此,基本上最糟糕的情况是每行少于100字节;因此,每kb 10行,每Mb 10000行。因此,您可以轻松地在1GB的堆中处理600万行


坦白地说,我认为我在这里犯了一个错误,因为我们每天都在这个空间中轻松地处理数百万行大约20个字段(包括小数、字符串等)。

Scala对象遵循与Java对象大致相同的规则,因此关于这些字段的任何信息都是准确的,对于32位JVM来说,这似乎基本上是正确的。(64位JVM每个指针使用8个字节,这通常意味着4个字节的额外开销加上每个指针4个字节——但如果JVM使用压缩指针,可能会少一些,我想现在它默认使用压缩指针。)

我将假设一个没有压缩指针的64位机器(最坏的情况);然后,
Tuple3
有两个指针(16字节)加上一个
Int
(4字节)加上对象开销(~12字节),四舍五入到最接近的8或32字节,再加上一个额外的对象(8字节),作为非专用版本的
Int
的存根。(遗憾的是,如果在元组中使用原语,它们会占用比使用包装版本更多的空间。)<代码>字符串是32个字节,IIRC,加上数据数组,每个字符16加2
java.sql.Timestamp
需要存储两个
Long
s(我想是的),所以是32字节。总共120个字节加上每个字符两个,20个字符等于160个字节


或者,有关直接测量对象大小的方法,请参见。当我以这种方式测量它时,我得到了160个字节(我上面的估计已经用这个数据进行了修正,所以它匹配;我以前有几个小错误)。

好的一点,我忘记了字符串中的额外开销加上对象开销。尽管如此,它并不是很多数据。为什么字符串数组中每个字符24加2?IIRC,一个数组是8字节,而非数组是4字节,加上元素。@DanielC.Sobral-有对象开销加上长度,在64位机器上是16字节,所以我有点偏离了。有什么后见之明吗?