scala中Case类的内存开销

时间:2013-12-22 12:21:30

标签: scala nlp type-erasure micro-optimization

scala中的case类的内存开销是多少?

我已经实现了一些代码来保存带有多种类型的实习令牌的词典,以便进行NLP处理。我为每种令牌类型都有一个案例类。

例如,规范引理/词干标记如下:

sealed trait InternedLexAtom extends LexAtom{
    def id      : Int
}
case class Lemma(id: Int) extends InternedLexAtom

我将返回这些实习令牌的文档向量,我在案例类中包装它们的原因是能够通过implicit classes向令牌添加方法。我之所以使用这种方式为词汇添加行为是因为我希望词汇根据不同的上下文有不同的方法。

所以我希望由于类型擦除,答案将是零内存开销。是这样的吗?

我怀疑单个指针可能包含了Scala可以做的一些魔法的参数:(

理由

把事情放在眼里。 JVM在我的词典加载时使用1.5-2gig的内存(词典中没有使用案例类的内存表示),而C ++在500-700mb的内存中也是如此。如果我的代码库继续以现在的方式扩展它的内存需求,我将无法在我的笔记本电脑上进行这些操作(内存中)

我会通过不同的方式构建我的代码来回避这个问题。例如,如果需要,我可以在矢量表示中删除案例类。如果我不必这样做会很好。

问题扩展。

Robin和Pedro已经解决了用例,谢谢。在这种情况下,我错过了价值类。有了那些没有更多的缺点。 另外:我尽量不提C ++的POD概念。但现在我必须要问:D A c ++ POD只是一个具有原始值的结构。如果我想将超过一个值打包到价值类中,我将如何实现这一目标?我假设这将是我想做的事情?

class SuperTriple(val underlying: Tuple2[Int,Int]) extends AnyVal {
    def super: underlying._1
    def triple: underlying._2
}

我确实需要上面的构造,因为我使用SuperTriple作为我的矢量模型符号:D

原始问题仍然存在"案例类"的开销是多少?

1 个答案:

答案 0 :(得分:1)

在Scala 2.10中,您可以使用value classes。 (在旧版本的Scala中,对于只有一个成员零开销的东西,您需要使用未装箱的标记类型。