2016-03-29 9 views
5

私は、私のアプリケーションをHeroku上で実行していて、Firebaseデータベースの特定のパスをリッスンしています。問題は、これらの経路を聴くことが膨大な量のメモリを占めるように見えることです。私のHerokuのサーバ上の総メモリの147メガバイトを占める場合、私は、それで13000の項目で以下のようなパス上の変化を聞く場合:Firebaseリスナーが膨大な量のメモリを占有しています

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

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

出力:

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 

を、それが正常な場合Firebaseは、それが聞いている経路のために非常に多くのメモリを占有するでしょうか?パス内のすべてのアイテムを取り出して各アイテムをリッスンするためですか?これを回避する方法はありますか?

答えて

5

Firebaseは、待機している場所(またはクエリ内)のデータを同期します。その場所にあるすべてのアクティブなデータのコピーをメモリに保持します。

メモリの使用量を減らすには、データが少ない場所を聴いてください。または、クエリ(例:limitToLast())を使用して、アクティブなデータの量を減らしてください。

NoSQLデータベースを使用する場合は、通常、アクティブなデータと履歴データを分離することをお勧めします。アクティブなデータセットを小さく保つことで、多くの操作のリソース使用量を減らすことができます。あなたのケースでは、Herokuサーバのメモリ使用量を減らすだけでなく、Firebaseサーバに必要なメモリ/ CPUも減らすことができます。これにより、処理速度も向上します。

+1

すぐにお返事ありがとうございます。 Firebaseデータベースで大量のデータを受信するのは悪い考えですか?彼らがここでやっているようにAlgoliaと同期するために私のFirebaseデータの特定の部分が必要なので、私はそれをやっています - http://scottksmith.com/blog/2014/12/09/algolia-real-time-search -with-firebase/- 特定の経路でリッスンしてAlgoliaに同期している場所。それはそれを行う方法ではありませんか? –

+2

少数の10KのアイテムがFirebaseサーバー上で問題になることはほとんどありませんが、明らかにHerokuサーバーはメモリ使用に問題があります。すべてがあなたのユースケースに依存します。そのため、私は物事の仕組みを記述することを好むのです。 –

関連する問題