Затраты памяти на классы Case в scala

Каковы накладные расходы памяти класса case в scala?

Я реализовал некоторый код для хранения лексикона с несколькими типами интернированных токенов для обработки NLP. У меня есть класс case для каждого типа токена.

Например, канонический токен леммы/основы выглядит следующим образом:

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

Я собираюсь возвращать векторы документов этих интернированных токенов, причина, по которой я оборачиваю их в классы case, заключается в том, чтобы иметь возможность добавлять методы к токенам через неявные классы. Причина, по которой я использую этот способ добавления поведения к лексемам, заключается в том, что я хочу, чтобы лексемы имели разные методы, основанные на разных контекстах.

Поэтому я надеюсь, что ответ будет нулевым накладным расходом памяти из-за стирания типа. Так ли это?

У меня есть подозрение, что один указатель может быть упакован параметрами для некоторых магических действий Scala :(

обоснование

Чтобы представить вещи в перспективе. JVM использует 1,5-2 гигабайта памяти с загруженным моим лексиконом (лексикон не использует классы case в своем представлении в памяти), а C++ делает то же самое в 500-700 МБ памяти. Если моя кодовая база продолжит масштабировать свои требования к памяти так, как сейчас, я не смогу делать это на своем ноутбуке (в памяти)

Я обойду проблему, по-другому структурировав свой код. Например, я могу просто удалить классы case в векторных представлениях, если мне нужно. Было бы неплохо, если бы мне не пришлось.

Расширение вопроса.

Робин и Педро обратились к варианту использования, спасибо. В этом случае мне не хватало классов значений. С ними минусов больше нет. дополнительно: я изо всех сил старался не упоминать концепцию POD в C++. Но теперь я должен спросить: D C++ POD - это просто структура с примитивными значениями. Если бы я хотел упаковать более одного значения в класс значений, как бы я этого добился? Я предполагаю, что это будет то, что я хочу сделать?

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

Мне действительно нужна приведенная выше конструкция, так как SuperTriple — это то, что я использую в качестве символа векторной модели: D

Исходный вопрос по-прежнему остается «каковы накладные расходы класса case».


person Hassan Syed    schedule 22.12.2013    source источник
comment
Если вы не планируете использовать класс для сопоставления с образцом, нет причин помечать его как case. Как вы упомянули, для класса implicit есть только три требования: 1. Они должны быть определены внутри другого класса trait/class/object. 2. Они могут принимать только один неявный аргумент в своем конструкторе. 3. В области видимости не может быть никакого метода, члена или объекта с тем же именем, что и у неявного класса.   -  person iuriisusuk    schedule 22.12.2013
comment
Это хороший момент, я еще не знаю, нужно ли мне сопоставлять шаблоны. Итак, вы косвенно подразумеваете, что обычные классы не требуют накладных расходов?   -  person Hassan Syed    schedule 22.12.2013
comment
Классы case дают гораздо больше, чем просто сопоставление с образцом: equals, hashCode и, в данном случае, проверку полноты.   -  person pedrofurla    schedule 22.12.2013
comment
Я думаю, вы смешиваете неявные классы с классами значений: docs.scala-lang .org/sips/pending/value-classes.html.   -  person pedrofurla    schedule 22.12.2013
comment
Если вы поместите объект класса значения (или примитив, такой как int, если уж на то пошло) в структуру данных, такую ​​​​как карта или вектор, он все равно будет упакован. Таким образом, существуют значительные накладные расходы по сравнению с работой с неупакованными целыми числами. Даже если вы превратите InternedLexAtom в класс значений, Map[String, InternedLexAtom] будет иметь накладные расходы, равные одному объекту на запись карты.   -  person Rüdiger Klaehn    schedule 23.12.2013


Ответы (1)


В Scala 2.10 вы можете использовать классы значений. (В более старых версиях Scala для чего-то с нулевыми накладными расходами только для одного члена вам нужно использовать неупакованные типы с тегами.)

person Robin Green    schedule 22.12.2013
comment
См. также/сначала: docs.scala-lang.org/overviews/core /value-classes.html . Из любопытства, откуда взялся термин unboxed tagged type? Я впервые сталкиваюсь с этим в контексте Scala. - person mikołak; 22.12.2013