Каковы накладные расходы памяти класса 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».
case
. Как вы упомянули, для классаimplicit
есть только три требования: 1. Они должны быть определены внутри другого классаtrait/class/object
. 2. Они могут принимать только один неявный аргумент в своем конструкторе. 3. В области видимости не может быть никакого метода, члена или объекта с тем же именем, что и у неявного класса. - person iuriisusuk   schedule 22.12.2013