Какими способами можно уменьшить использование памяти программой NodeJS, использующей рабочие потоки? - PullRequest
0 голосов
/ 07 мая 2020

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

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

Функция, которая вызывается для каждого фрагмента для извлечения дополнительных данных (inData содержит массив фрагмента, addProper - это справочные данные, которые сравниваются с объектом key: value, DataOut - это функция, которая записывает фрагмент в файл; это не асинхронный c)

//Check if other details of the address are correct by the post code
DataValid: async function DataValid(inData, final) {
    const promise = new Promise((resolve, reject) => {
        //Check if city is correct
        let worker = new Worker('./cityprocess.js', {workerData: [inData, addProper]});
        worker.on('message', (message) => resolve(message));
        worker.on('error', reject);

        //Pass updated list with validated cities to DataOut
    });

    promise.then((val) => {
        this.DataOut(val, final);
    });
},

Вот как я запускаю сценарий, который является рабочим потоком (сценарий cityprocess. js)

if (workerData != null) {
    ChunkPull(workerData[0]);
}

Это функция, которая вызывается в конце обработки фрагмента, когда пора возвращать обновленный фрагмент в основной скрипт (addChunk - это обновленный фрагмент)

function ReturnParentMessage(code) {
    parentPort.postMessage(addChunk);
    worker.terminate();
}

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

...