2017-01-13 7 views
1

非常に基本的なfirebase + firebase-queue + GeoFireコードがNode上で動作しているように見えますが、メモリリークの原因と思われますが、どこかで何かを犯していないと私は確信していません。ここで Node 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分、それがクラッシュするまでに解決1100のタスクの後にメモリの1.5ギガバイトをgobblingこのコードを示して、メモリ使用量からメモリ消費量のグラフです。

memory consumption charted by memory-usage

ここで何が起こっているかについての任意のアイデア?

これが実行されている:

  • ノード6.7.0
  • firebase管理者4.0.4
  • firebaseキュー1.6.1
  • geofire 4.1.1
+0

何があまりにもクエリ自体を、キャンセルした場合: 'geoQuery.cancel();'?それがなければ、キューから処理された各タスクに対してクエリがぶら下がることはありませんか? – cartant

+0

それはそれをしたように見えます。ありがとう。あなたが答えとして投稿するなら、私はそれを受け入れるでしょう。 – brainbolt

答えて

2

リークは、GeoFireクエリによって発生します。キューからのタスクが処理されるたびに、クエリが作成されますが、それらのクエリは決してキャンセルされず、リスナだけが削除されます。

リークを防止するには、完了したらクエリでcancelを呼び出します。たとえば、次のように

geoQuery.on('ready', function() { 
    listener.cancel(); 
    geoQuery.cancel(); 
    resolve(); 
}); 
関連する問題