小编Vin*_*Bdn的帖子

Scala - 在这种情况下,为什么Double比Floats消耗更少的内存?

这是我陷入的一种奇怪的行为,我找不到任何关于为什么会这样的暗示.我在这个例子中使用了来自Spark的SizeEstimator估计方法,但我没有在代码中发现任何故障,所以我想知道为什么 - 如果它们提供了很好的内存估计 - 为什么我有这个:

val buf1 = new ArrayBuffer[(Int,Double)]
var i = 0
while (i < 3) {
   buf1 += ((i,i.toDouble))
   i += 1
}
System.out.println(s"Raw size with doubles: ${SizeEstimator.estimate(buf1)}")
val ite1 = buf1.toIterator
var size1: Long = 0l
while (ite1.hasNext) {
   val cur = ite1.next()
   size1 += SizeEstimator.estimate(cur)
}
System.out.println(s"Size with doubles: $size1")

val buf2 = new ArrayBuffer[(Int,Float)]
i = 0
while (i < 3) {
   buf2 += ((i,i.toFloat))
   i += 1
}
System.out.println(s"Raw …
Run Code Online (Sandbox Code Playgroud)

memory scala scala-collections apache-spark

11
推荐指数
1
解决办法
497
查看次数

序列化的Scala反射(通过Spark) - 符号不可序列化

首先,我使用的是scala 2.10.4,上面的例子是在Spark 1.6中运行的(尽管我怀疑Spark与此有什么关系,但它只是一个序列化问题).

所以这是我的问题:假设我有一个Base由两个类B1和两个类实现的特征B2.现在我有一个通用的特性,它由一组类扩展,其中一个超过了Base例如子类型(这里我保留了Spark的RDD概念,但它实际上只要它被序列化就可以了;有些东西只是一个结果无论实际上是什么):

trait Foo[T] { def function(rdd: RDD[T]): Something }
class Foo1[B <: Base] extends Foo[B] { def function(rdd: RDD[B]): Something  = ... }
class Foo2 extends Foo[A] { def function(rdd: RDD[A]): Something  = ... }
...
Run Code Online (Sandbox Code Playgroud)

现在我需要一个对象RDD[T](这里假设没有模糊,它只是一个简化版本),它返回Something对应于与类型对应的函数的结果T.但它也适用于Array[T]合并策略.到目前为止它看起来像:

object Obj {
   def compute[T: TypeTag](input: RDD[T]): Something = {
      typeOf[T] match {
         case t if t <:< typeOf[A] => 
            val foo = new …
Run Code Online (Sandbox Code Playgroud)

reflection serialization scala apache-spark

5
推荐指数
1
解决办法
1088
查看次数