Как использовать последовательности и лямбды Котлина таким образом, чтобы эффективно использовать память - PullRequest
0 голосов
/ 09 октября 2019

Итак, я нахожусь в процессе написания кода, который должен быть эффективным и быстрым. У меня уже есть рабочая ссылка на java, но я переписывал ее на kotlin.

Мне нужно загрузить множество файлов csv и загрузить их в дерево один раз, а затем повторно просмотреть их после загрузки.

Первоначально я написал все это с использованием последовательностей, но обнаружил, что это вызывает многократный всплеск GC.

Я не могу на самом деле поделиться этим кодом, но мне было интересно, если вы знаете, что может вызвать этослучиться.

Я буду рад добавить детали по мере необходимости, но вот мой основной шаблон.

step1: inputStream -> csvLines: List<String>

step2: csvLines.drop(x).fold(emptySequence()) -> callOtherFunctionWithFold -> callOtherFunctionWithFold -> Sequence<OutputObjects>

Я храню csvLines в виде отдельного списка, потому что у меня есть доступ к определенным строкам на основе необходимых мне правил.

step3: Sequence<OuputObjects> -> nodes

Результат работает,но этот код намного менее эффективен для памяти и менее производителен, чем эквивалент Java, только с использованием массивов и их модификацией.

Посмотрев на вывод visualvm, я создал тонну kotlin. *. ArrayIterators. Похоже, я создаю его каждый раз, когда использую лямду.

Так что я могу сделать, чтобы сделать это более эффективным? Я думал, что последовательности должны были лениво сокращать создание объекта, но похоже, что я делаю вещи, которые нарушают его способность делать это.

Переоценки последовательностей после запуска или запуска GC вообще? Если это так, это сделает их непригодными для использования в объектах, которые загружаются при запуске, верно?

visual vm run

1 Ответ

3 голосов
/ 10 октября 2019

Чтобы использовать последовательности Kotlin, вам нужно начать с asSequence()

csvLines.asSequence()
    .drop(x)
    .fold(...)
    ...

. Если вы пропустите это, вместо этого будут использоваться функции Collection, которые создают новую (промежуточную) коллекцию после каждой функции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...