2016-05-06 5 views
1

я имею типичный код для запуска WebWorker в узле:Быстро растет память при запуске WebWorker в Node.js с «большими» данными

var Threads = require('webworker-threads');  
var worker = new Threads.Worker(__dirname + '/workers/myworker.js'); 

worker.onmessage = function (event) { 
    // 1. 
    // ... create and execute cypher query ... 
}; 

// Start the worker. 
worker.postMessage({ 
    'data' : data 
}); 

В 1. Я посылаю небольшие кусочки обработанных данных в Neo4j дб. Для небольших data это работает отлично, но когда данные получают чуть больший узел/рабочий начинает бороться.

Фактический data Я хочу обработать csv, который я проанализировал с помощью BabyParse, в результате чего объект с 149000 свойствами, где у каждого есть еще 17 свойств. (149000 строк по 17 столбцов = 2533000 свойств). Файл - 17 МБ.

При выполнении этого узла выделяется много памяти и, в конечном счете, падает примерно на 53% распределения памяти. Машина имеет 4 ГБ.

Работник выглядит примерно так:

self.onmessage = function (event) { 
    process(event.data.data); 
}; 

function process(data) { 
    for (var i = 0; i < data.length; i++) { 
     self.postMessage({ 
      'properties' : data[i] 
     }); 
    } 
} 

Я попытался кусок данных и обрабатывать его chunkwise в работнике, который также работает нормально. Но я хочу сгенерировать график и обработать ребра, которые мне нужны полные данные, потому что мне нужно проверить каждую строку (вершину) на все остальные.

Есть ли способ передать данные работнику? Или у кого-нибудь есть идея, почему узел выделяет столько памяти с 17 МБ отправляемых данных?

ответ

1

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

Другой вариант заключается в использовании пакета npm csv с потоковым синтаксическим анализатором. postMessage линии, когда они входят, и буферизуют их до конечного результата у рабочего.

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

+0

Спасибо, я не знал, что файловая система доступна в веб-работниках. – Wipster