Node GeoFire内存泄漏?

时间:2017-01-13 08:09:52

标签: node.js firebase memory-leaks geofire firebase-queue

我有一些似乎是在Node上运行的非常基本的firebase + firebase-queue + GeoFire代码,这似乎导致了内存泄漏,但我不相信我不会在某处搞砸某事。

'use strict';

if (!process.env.FIREBASE_PROJECT_ID) {
  require('dotenv').config({ silent: true });
}

let fbConfig = require('./firebase-config');
let fbNodes = fbConfig.NODES;
let Queue = require('firebase-queue');
let admin = require("firebase-admin");
let GeoFire = require('geofire');

admin.initializeApp({
  credential: admin.credential.cert(fbConfig.FIREBASE_SERVICE_ACCOUNT),
  databaseURL: fbConfig.APP_SETTINGS.databaseURL
});

let db = admin.database();
let queueRef = db.ref(fbNodes.QUEUE);
let geoFire = new GeoFire(db.ref(fbNodes.GEOFIRE));

var q = new Queue(queueRef, function (data, progress, resolve, reject) {
  let geoQuery = geoFire.query({
    center: data.queryCenter,
    radius: data.maxDistanceKm
  });

  // fires for every key returned by the geoQuery
  let listener = geoQuery.on('key_entered', function (key, loc, dist) {
    // do nothing
  });

  // This will fire once the initial data is loaded, so now we can cancel 
  // the "key_entered" event listener
  geoQuery.on('ready', function () {
    listener.cancel();
    resolve();
  });
});

以下是内存使用情况下的内存消耗图表,显示此代码在大约10分钟后吞噬了1.5 GB的内存,并解决了1100个任务,直至崩溃。

memory consumption charted by memory-usage

关于这里发生了什么的任何想法?

这是在:

上运行
  • node 6.7.0
  • firebase-admin 4.0.4
  • firebase-queue 1.6.1
  • geofire 4.1.1

1 个答案:

答案 0 :(得分:2)

泄漏是由GeoFire查询引起的。每次处理队列中的任务时,都会创建一个查询,但这些查询永远不会被取消 - 只有他们的监听器才会被取消。

要堵塞泄漏,请在完成后立即致电cancel。例如:

geoQuery.on('ready', function () {
  listener.cancel();
  geoQuery.cancel();
  resolve();
});