2016-03-29 27 views
5

Ich habe einen Knoten Arbeiter entlang meiner Seite auf Heroku, die auf bestimmte Pfade in meiner Firebase-Datenbank überwacht. Das Problem ist, dass das Anhören dieser Pfade sehr viel Speicherplatz in Anspruch nimmt. Wenn ich für Änderungen auf einem Pfad wie unten mit 13000 Einheiten auf sie zu hören, nimmt, wenn 147mb Gesamtspeicher auf meinem Heroku Server:Firebase-Listener verbrauchen viel Speicherplatz

setInterval => 
    @ref.log_memory('Listener interval') 
, 1000 

@ref.firebaseClient.child('listings').on 'child_changed', (snap) => 
    @ref.log('child_changed') 

Ausgang:

22:39:07 worker.1 | info: Memory: 35mb total - 66mb rss - 23mb heapUsed 
22:39:08 worker.1 | info: Memory: 36mb total - 67mb rss - 18mb heapUsed 
22:39:09 worker.1 | info: Memory: 37mb total - 69mb rss - 23mb heapUsed 
22:39:10 worker.1 | info: Memory: 54mb total - 72mb rss - 25mb heapUsed 
22:39:11 worker.1 | info: Memory: 54mb total - 82mb rss - 33mb heapUsed 
22:39:13 worker.1 | info: Memory: 147mb total - 186mb rss - 94mb heapUsed 
22:39:14 worker.1 | info: Memory: 147mb total - 186mb rss - 94mb heapUsed 
22:39:15 worker.1 | info: Memory: 147mb total - 186mb rss - 94mb heapUsed 
22:39:15 worker.1 | info: child_changed 
22:39:16 worker.1 | info: Memory: 147mb total - 186mb rss - 95mb heapUsed 
22:39:17 worker.1 | info: Memory: 147mb total - 186mb rss - 95mb heapUsed 

Wenn es normal, dass Firebase würde so viel Speicher für einen Pfad aufnehmen, auf den er hört? Ist es, weil es alle Einzelteile im Weg holt und jedes Einzelteil hört? Gibt es eine Möglichkeit, dies zu umgehen?

Antwort

5

Firebase synchronisiert die Daten an der Position (oder in der Abfrage), die Sie abhören. Es behält eine Kopie aller aktiven Daten an diesem Ort im Speicher.

Um die Speichernutzung zu reduzieren, hören Sie sich einen Ort mit weniger Daten an. Oder verwenden Sie eine Abfrage (z. B. mit limitToLast()), um die Menge der aktiven Daten zu reduzieren.

Es ist in der Regel eine gute Idee, Ihre aktiven Daten von Ihren historischen Daten zu trennen, wenn Sie eine NoSQL-Datenbank verwenden. Indem Sie den aktiven Datensatz klein halten, können Sie die Ressourcennutzung für viele Operationen reduzieren. In Ihrem Fall würde dies nicht nur die Speicherauslastung auf Ihrem Heroku-Server reduzieren, sondern auch den auf den Firebase-Servern benötigten Speicher/CPU-Speicher reduzieren, was ebenfalls den Betrieb beschleunigen würde.

+1

Danke für die schnelle Antwort. Ich denke, die Antwort ist, dass das Abhören großer Datenmengen in Ihrer Firebase-Datenbank eine schlechte Idee ist. Ich mache es, weil ich bestimmte Teile meiner Firebase-Daten mit Algolia synchronisieren muss, so wie sie es hier tun - http://scottksmith.com/blog/2014/12/09/algolia-real-time-search -with-firebase/- wo sie auf einem bestimmten Pfad zuhören und das mit Algolia synchronisieren. Also ist das nicht der richtige Weg? –

+2

Einige 10K Elemente sind auf den Firebase-Servern selten ein Problem, aber anscheinend hat Ihr Heroku-Server ein Problem mit der Speichernutzung. Es hängt alles von Ihrem Anwendungsfall ab, weshalb ich lieber beschreibe, wie die Dinge funktionieren. –

Verwandte Themen