2012-07-03 4 views
4

Я проектирую демона (в частности, рабочий процесс для Heroku) и код, который я медленно накапливаю в использовании плунжера. Это небольшая сумма (100 кб/10 секунд), но я знаю, что для долгосрочного использования этого процесса лучше всего поддерживать равномерность использования плунжера. Я новичок в создании процессов, разработанных для долгого времени и все еще довольно новых для разработки приложений в Node и Javascript. Вот большая часть моего кода:Утечка памяти в программе Node.js

//////////////// 
// Queue Loop // 
//////////////// 
var worker = (function() { 
var buffer = ""; 
var couchdb = http.get({ 
    auth: db_user + ":" + db_pass, 
    host: db_host, 
    path: '/queue/_all_docs?include_docs=true', 
    port: db_port 
}, function(response) { 
    response.setEncoding('utf8'); 

    response.on("data", function(data) { 
     buffer += data; 
    }); 

    response.on("end", function() {   
     var queue = JSON.parse(buffer); 

     if (!queue.error) { 

      buffer = ""; 
      couchdb = http.get({ 
       auth: db_user + ":" + db_pass, 
       host: db_host, 
       path: '/flights/_all_docs?include_docs=true', 
       port: db_port 
      }, function(response) { 
       response.setEncoding('utf8'); 

       response.on("data", function(data) { 
        buffer += data; 
       }); 

       response.on("end", function() { 
        var flights = JSON.parse(buffer); 

        if (!flights.error) { 
         for (row in queue.rows) { 
          console.log(queue.rows[row].doc.flight); 
         } 

      for (row in flights.rows) { 
       console.log(flights.rows[row].doc.program); 
       } 

       setTimeout(worker, 10000);  
      } else { 
       // db error 
      } 
      }); 
     }).on("error", function() { 
      setTimeout(worker, 10000);  
     }); 
      } else { 
       // db error 
      } 
     }); 
    }).on("error", function() { 
     console.error("CouchDB is currently not available."); 
     setTimeout(worker, 10000); 
    }); 
}); 



/////////////// 
// Run Queue // 
/////////////// 
(function() { 
    worker(); 
})(); 

Так с тем, что это лучший способ сохранить программу, как это работает постоянно с одинаковым количеством оперативной памяти? Какие другие соображения дизайна необходимы для того, чтобы это было достаточно хорошо, чтобы служить рабочим процессом на Хереку?

О, и для чего он это делает, он извлекает некоторые записи из экземпляра CouchDB, а затем запускает предсказание на основе этих записей.

ответ

3

Оказалось, что Node.js предлагает прекрасную функцию под названием process.nextTick(), которая очищает стек вызовов (редактирование: это может быть не так, но это помогает вещи от накопления). Объединив все мои вызовы работнику в нем, я мог бы предотвратить теоретическое переполнение стека (чего не было, но использование памяти постоянно росло).

Мое понимание этой функции не очень глубокое, но оно делает то, что я хотел делать.

(редактирование: ОКАЗЫВАЕТСЯ узел ФАНТАСТИКА мусора через V8, он работает на странных интервалах, хотя)

Читает:

Смежные вопросы