0

我正在使用 node.js 将大量数据聚合到 EC2 Micro 实例上的 Firebase 中。该应用程序会扫描许多来源的照片,并维护有关每张照片的元数据的 Firebase,例如 URL、大小、来源、“喜欢”等。

我还更新了一些聚合索引(按日期、按喜欢等)。实际代码非常简单:

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)只有 615mb 的可用 RAM,我的 RAM 用完了,因为 Firebasephotos在更新时缓存了集合的所有子级。

有没有办法防止 Firebase 用其内存缓存耗尽所有可用的 RAM?

4

1 回答 1

6

Firebase 会缓存您当前有未完成回调的所有内容。因此,只要您在某个位置执行 on(),我们就会加载所有数据并将其保存在内存中。我们必须这样做才能计算差异并模拟本地事件。

您是否将实际图像存储在 Firebase 中?

如果您有大量数据并且不希望全部加载,我建议分离出大块数据并仅同步元数据。例如,您可以将照片存储在 /photos,但将有关喜欢的信息和其他元数据存储在 /photos_metadata。

如果您只是使用元数据并且拥有大量元数据,那么您应该做的是维护一个“最近更改”队列。然后当客户端更新一些数据时,它也会推送到队列中。然后,您的节点进程只会监听该队列、处理更改并删除队列条目。如果它需要在处理过程中同步元数据,它可以逐张执行,然后在完成时调用 off()(或只使用一次())。

于 2013-05-28T18:37:28.193 回答