Node.js утечка памяти при использовании .map для создания массива - PullRequest
0 голосов
/ 12 марта 2020

Я делаю повторные запросы к сайту, используя узел, и пытаюсь отладить возникающую утечку памяти. Используя node --inspect server.js, я смог догадаться, что это код, вызывающий проблему (это раздел Обещания, отсюда и «resol ()» в конце):

response.on('end', function () {
    //store response in variable
    bufferData = Buffer.concat(bufferData);
    try {
        var bufferDataDecoded  = thisProtocol.FeedMessage.decode(bufferData).entity;
    } catch (e) {
        console.log("Protocol Error:  "+e);
        resolve([0]);
    }
    var timeNow = new Date();
    var bufferDataMapped= bufferDataDecoded
    .map(obj=> {
        return obj.item_update
            .map(itemu=>{
            if ((itemu.quantityOld-itemu.quantityNew) > 0 ){
                return {
                "resultType": bufferType
                ,"itemID": itemu.itemID
                ,"quantityOld": itemu.quantityOld
                ,"quantityDiff": itemu.quantityNew - itemu.quantityOld
                };
            }
            else return false;
        })
    });
    var bufferDataMapped2= [].concat.apply([],bufferDataMapped);
    resolve(bufferDataMapped2);
}); 

От глядя на журнал сравнения, выходящий из --inspect и просматриваемый с помощью Chrome DevTools, выглядит, что node.js сохраняет эти объекты следующим образом:

 {
   "resultType": bufferType
   ,"itemID": itemu.itemID
   ,"quantityOld": itemu.quantityOld
   ,"quantityDiff": itemu.quantityNew - itemu.quantityNew
 };

... каждый раз, когда программа запускается, и не удаляя старые после его запуска, что быстро способствует переполнению памяти. Я создал переменные локально в .map (), чтобы избежать этой проблемы, и не уверен, что делаю неправильно. Есть идеи, почему это будет происходить?

1 Ответ

0 голосов
/ 15 марта 2020

Мне не хватает некоторого кода, поэтому вот мой вывод. Взгляните на этот код:

bufferData = Buffer.concat(bufferData);

bufferData является глобальной переменной, поэтому при каждом выполнении происходит конкатенация данных предыдущих выполнений. Попробуйте присвоить значение null в конце каждого выполнения:

response.on('end', function () {
    ... rest of the code ...

    resolve(bufferDataMapped2);
    bufferData = null;
}); 

Но, чтобы получить лучший ответ, я хотел бы увидеть остальную часть кода.

...