2013-05-28 53 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存儲有關喜歡和其他元數據的信息。

如果你只是處理元數據而且你有很多它,你應該做的就是維護一個「最近的變化」隊列。然後,當客戶端更新某些數據時,它也會推送到隊列中。您的節點進程然後只是偵聽該隊列,處理更改並刪除隊列條目。如果需要在處理過程中同步元數據,它可以在逐個照片的基礎上進行,然後在完成時關閉()或僅使用一次()。