0

node.js を使用して、EC2 Micro インスタンスの Firebase に大量のデータを集約しています。このアプリは、写真の多くのソースをスキャンし、URL、サイズ、出所、「いいね」など、各写真に関するメタデータの Firebase を維持します。

また、いくつかの集計インデックスを更新しています (日付別、いいね! など)。実際のコードは非常に単純です。

var db = new Firebase('https://my.firebaseio.com')

// Whenever the aggregator updates a photo, update the popularity inedx
db.child('photos').on('child_changed', function(snapshot) {
    var instagram = snapshot.child('likes/instagram').val() || 0,
        facebook = snapshot.child('likes/facebook').val() || 0,
        likes = instagram + facebook

    // Update popularity index
    db.child('index/popularity').child(snapshot.name()).setWithPriority(true, likes)
})

私のインスタンス (t1.micro) には 615 MB の RAM しかないため、photos更新中に Firebase がコレクションのすべての子をキャッシュするため、RAM が不足しています。

Firebase がメモリ内キャッシュで利用可能なすべての RAM を使い果たすのを防ぐ方法はありますか?

4

1 に答える 1

6

Firebase は、現在未解決のコールバックがあるすべてのキャッシュを保持します。そのため、ある場所で on() を実行するとすぐに、すべてのデータが読み込まれ、メモリに保持されます。これを行う必要があるのは、差分を計算してローカル イベントをシミュレートできるようにするためです。

実際の画像を Firebase に保存していますか?

大量のデータがあり、すべてをロードしたくない場合は、データの大きなチャンクを分離し、メタデータのみを同期することをお勧めします。たとえば、写真は /photos に保存し、いいねやその他のメタデータに関する情報は /photos_metadata に保存できます。

メタデータを扱っているだけで、メタデータが大量にある場合は、「最近の変更」のキューを維持する必要があります。次に、クライアントがデータの一部を更新すると、それもキューにプッシュされます。その後、ノード プロセスはそのキューをリッスンし、変更を処理して、キュー エントリを削除します。処理中にメタデータを同期する必要がある場合は、写真ごとに同期し、完了したら off() を呼び出します (または once() を使用します)。

于 2013-05-28T18:37:28.193 に答える