2013-05-28 52 views
0

我正在使用node.js将大量数据聚合到EC2 Micro实例上的Firebase中。该应用程序扫描照片的一些来源,并维护每个照片的元数据的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)仅有的可用我跑出来的RAM作为火力地堡缓存photos收集的所有孩子RAM 615mb他们正在更新,而。

有没有一种方法可以防止Firebase利用其内存中的缓存耗尽所有可用的RAM?

回答

5

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

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

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

如果你只是处理元数据而且你有很多它,你应该做的就是维护一个“最近的变化”队列。然后,当客户端更新某些数据时,它也会推送到队列中。您的节点进程然后只是侦听该队列,处理更改并删除队列条目。如果需要在处理过程中同步元数据,它可以在逐个照片的基础上进行,然后在完成时关闭()或仅使用一次()。