Итак, я нахожусь в процессе написания кода, который должен быть эффективным и быстрым. У меня уже есть рабочая ссылка на 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 вообще? Если это так, это сделает их непригодными для использования в объектах, которые загружаются при запуске, верно?
