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このコードを示して、メモリ使用量からメモリ消費量のグラフです。
ここで何が起こっているかについての任意のアイデア?
これが実行されている:
- ノード6.7.0
- firebase管理者4.0.4
- firebaseキュー1.6.1
- geofire 4.1.1
何があまりにもクエリ自体を、キャンセルした場合: 'geoQuery.cancel();'?それがなければ、キューから処理された各タスクに対してクエリがぶら下がることはありませんか? – cartant
それはそれをしたように見えます。ありがとう。あなたが答えとして投稿するなら、私はそれを受け入れるでしょう。 – brainbolt