Что нужно понять о языке и сборке мусора в целом, так это:
data = data.toUpperCase().split(/[^a-zA-Z]/).filter(...)
создает три дополнительных копий ваших данных. Во-первых, заглавная копия. Затем разделить массив массива. Затем отфильтрованная копия разделенного массива.
Итак, на данный момент у вас есть четыре копии ваших данных в памяти. Все, но отфильтрованный массив теперь пригоден для сборки мусора, когда G C получает возможность запуска, но если эти данные изначально были большими, вы будете использовать как минимум в 3x-4x больше памяти, чем размер файла (в зависимости от того, сколько элементов массива удалено в вашей операции .filter()
).
Ничто из этого не является утечкой, но это очень большое пик использование памяти что может быть проблемой.
Более эффективный способ обработки больших файлов - это обрабатывать их как поток (не считывать их все в память сразу). Вы читаете порцию небольшого размера (скажем, 1024 байта), обрабатываете ее, читаете порцию, обрабатываете, одновременно следя за границами порции. Если ваш файл, естественно, имеет границы строк, уже есть готовые решения для обработки строк за строкой. Если нет, вы можете создать свой собственный механизм обработки чанка. Нам нужно посмотреть образец ваших данных, чтобы сделать более конкретные c предложения по обработке чанков.
В качестве еще одного момента, если у вас будет много ключей в invIndex
, тогда это Строка кода начинает становиться неэффективной, и вы делаете это в вашем l oop:
Object.keys(invIndex).sort()
Это берет ваш объект и получает все ключи во временном массиве, который вы используете только для целей обновление sortedInvIndex
, которое является еще одной копией ваших данных. Итак, прямо здесь, этот набор кода создает три копии всех ваших ключей и две копии всех значений. И он делает это каждый раз через ваш l oop. Опять же, много пиковых использования памяти, которое G C обычно не очищает, пока ваша функция не будет выполнена.
Редизайн для способ обработки этих данных может снизить пиковое использование памяти в 100 раз. Для эффективности памяти вы хотите, чтобы только начальные данные, окончательное представление данных, а затем немного больше, использовались для временных преобразований, которые использовались одновременно. Вы никогда не хотите обрабатывать все данные несколько раз, потому что каждый раз, когда вы это делаете, создается еще одна полная копия всех данных, которая способствует пиковому использованию памяти.
Если вы показываете как выглядит ввод данных и какова структура данных, которую вы пытаетесь получить, я мог бы, вероятно, попробовать гораздо более эффективную реализацию.