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