2009-05-25 100 views
1

這適用於Google App Engine,但不一定受此限制。攤銷適用於App Engine的分配(和百分比)計算?

在Google App Engine上,數據庫不是關係數據庫,因此不能實現聚合函數(如總和,平均值等)。每一行都是相互獨立的。爲了計算總和和平均值,應用程序只需通過重新計算每個新寫入到數據庫的數據來分攤計算,以便它始終保持最新。

如何計算百分位數和頻率分佈(即密度)?我想繪製一個值域的密度圖,這組值可能是數百萬的數量級。循環遍歷整個數據集可能是可行的(每個查詢的限制是返回1000行),並基於此計算,但我寧願採取一些智能方法。

是否有一些算法可以計算或近似密度/頻率/百分比分佈,可以計算一段時間?

順便說一句,數據是不確定的,因爲最大值和最小值可能是全部的地方。因此,分佈將需要大約95%的數據,並且僅基於該數據做密度。

回答

0

循環遍歷整個數據集(每個查詢的限制是返回1000行)可能是可行的,並基於此計算,但我寧願做一些聰明的方法。

這是對我最明顯的方法,你爲什麼試圖避免它?

+2

GAE限制了操作可能需要多長時間以及數據存儲區CPU時間。一切都以http請求完成,因此每個請求只有很多數據可以通過。如果採用更簡單的方法,將大型工作劃分爲多個操作併合並結果可能會遇到麻煩。 – 2009-05-25 23:17:51

2

爲了每行獲得一個數字,一遍又一遍地獲得整行(一次限制1000個)肯定沒有吸引力。因此,通過在包含數字列表的單獨實體中記錄該單個數字來對數據進行非規範化處理(對於每個查詢,我相信1 MB,因此每個列表的4個字節數不超過250,000個數字)。

所以當添加一個數字的時候也會獲取最新的「增加的數據值列表」實體,如果全部換成新的,添加新的數字並保存。如果您認爲統計數據中的一個小錯誤並不是真正的殺手,那麼可能不需要進行交易。

如果可以更改項目的數據,則具有記錄「已刪除」數據值的相同類型的單獨實體;將一個項目的值從23更改爲45,將最新的「刪除值」列表中的23加上,將最新的「加值」加上45,即可刪除項目。

+0

但是,這是做什麼?而不是每個數字的一​​行,我現在有一行25萬個數字。如何使用? 您的回答讓我覺得,如果櫻桃爲每1000個數字選擇一個數字,這樣我就可以得到一個統計相關的樣本,這個樣本也足夠小,可以對數據進行計算...... – 2009-05-25 23:30:28