получить размер класса объекта / дела в Scala - PullRequest
0 голосов
/ 15 мая 2018

Я пытаюсь найти размер моего объекта класса case в проекте scala, используя sizeEstimator, но он дает неожиданные результаты.

import org.apache.spark.util.SizeEstimator
case class event(imei: String, date: String)
val check = event(imei, date)
      println("size is event obj " + SizeEstimator.estimate(check))
      println("size is single charct " + SizeEstimator.estimate("a"))
      println("size is imei " + SizeEstimator.estimate(imei))

Он выводит как

size is event obj 520
size is single 48
size is imei 72

Почему это принимает безумный размер?для одиночного символа "a" это должен быть 1 байт, а мой imei - это 15-символьное строковое значение, для него также должно быть 15 байт.Любые предложения, пожалуйста.Спасибо,

1 Ответ

0 голосов
/ 15 мая 2018
scala> val char:java.lang.Character = 'a'
char: Character = a

scala> SizeEstimator.estimate(char)
res18: Long = 16

scala> SizeEstimator.estimate("A")
res19: Long = 48

Если вы хотите иметь фактический размер кучи Java, вам нужно будет объявить их конкретно с типами Java, иначе это не сработает, просто заключив одинарные кавычки.

scala> SizeEstimator.estimate('A')
<console>:27: error: type mismatch;
 found   : Char('A')
 required: AnyRef
Note: an implicit exists from scala.Char => java.lang.Character, but
methods inherited from Object are rendered ambiguous.  This is to avoid
a blanket implicit which would convert any scala.Char to any AnyRef.
You may wish to use a type ascription: `x: java.lang.Character`.
              SizeEstimator.estimate('A')

А в целом ниже приведена формула расчета размера строки -

Минимальное использование памяти строк (в байтах) = 8 * (int) ((((без символов) * 2) + 45) / 8)

...