2009-12-22 169 views
8

我對java appengine使用了新的實驗性任務,我試圖創建在我的數據存儲中彙總統計信息的任務。我試圖計算我的數據存儲中所有實體(特定類型)中的UNIQUE值的數量。更具體地說,類型X的實體有一個字段A.我想在我的數據存儲中計算A的唯一值的數量。appengine任務有效載荷有多大?

我目前的做法是創建一個任務,查詢類型X的前10個實體,創建一個散列表來存儲A的唯一值,然後將該散列表作爲有效負載傳遞給下一個任務。接下來的任務將會計算接下來的10個實體,等等,直到我完成所有的實體。在執行最後一項任務期間,我將計算我的散列表中的密鑰數量(從任務一直傳遞給任務)以找出A的唯一值總數。

這適用於小型我的數據存儲中的實體數量。但是我擔心,一旦我擁有很多獨特的值,這個哈希表就會變得太大。 appengine任務的有效載荷的最大允許尺寸是多少?

您能否提出其他方法?

謝謝。

回答

14
+2

+1對於冷硬事實。 – Kredns 2009-12-22 03:24:44

+0

確實對象大小=有效負載大小? – aloo 2009-12-22 05:21:08

+4

你需要以某種方式序列化你的對象。這是有效載荷。如果您希望它超過10k,可以使用延遲庫的序列化包含實際數據的數據存儲區實體的密鑰的技巧。 – 2009-12-24 19:23:44

1

「你能提出任何其他方法嗎?」。

通過基於值構建密鑰並使用Model.get_or_insert爲每個唯一值創建一個實體。然後使用普通的分頁技巧,將1000個批次中的實體(或者在您的請求超時之前計算出的數量超過10個)進行統計。

或者使用類似於get_or_insert文檔中給出的代碼來保持計數 - App Engine事務可以運行多次,因此事務中遞增的memcached計數將不可靠。不過,這可能會有一些竅門,或者你可以在數據存儲中保留計數,只要你對實體父母沒有任何不愉快的事情。

0

這可能爲時已晚,但也許可以使用。首先,任何時候如果您想遠程連續瀏覽一組實體,建議使用索引的date_created或date_modified auto_update字段。從這一點開始,您可以使用json.dumps()創建一個帶有TextProperty的模型來存儲您的哈希表。您只需傳遞處理的最後日期以及散列表實體的模型ID。使用晚於最後日期的date_created查詢,json_load()TextProperty,並累積下10條記錄。可以更復雜一點(例如,通過利用傳遞的參數和稍微不同的查詢方法處理date_created碰撞)。向下一個任務添加1秒倒計時,以避免更快地更新散列表實體的任何問題。 HTH,-stevep