0

我正在嘗試迭代大量的數據存儲記錄,目前大約有33萬個。從概念上講,每條記錄都有一行,一列和一個值,我遍歷記錄並構造一個矩陣,然後我將用它來進行計算。無法迭代大量的DataStore記錄

我得到的錯誤是:超時:數據存儲操作超時或數據暫時不可用。

[ADDED:請注意,我的問題不是應用程序引擎超時。作爲CRON工作運行,我有足夠的時間,數據存儲錯誤發生得比應用程序引擎超時更快。另外,我已經嘗試了其他問題中給出的答案,正如我在下面提到的那樣。]

錯誤發生在迭代運行超過100,000條記錄之後。

我當前的代碼,這是我過去諮詢相關的線程後寫道,是:

prodcauses_query = ProdCause.query(projection=['prod_id', 'value', 'cause']).filter(ProdCause.seller_id == seller_id) 
    for pc in prodcauses_query.iter(read_policy=ndb.EVENTUAL_CONSISTENCY, deadline=600): 
     ### COPY DATA IN RECORD PC INTO A MATRIX 
     ### row is prod_id, col is cause, value is value 

有沒有什麼更好的辦法來做到這一點比ITER?有關batch_size或截止日期或read_policy的更好設置?

請注意,此過程在CRON作業中運行,因此如果花費很長時間才能完成此操作,則不會打擾到我。這個過程的其餘部分需要幾秒鐘的時間,最難的部分是讀取數據。

感謝您的任何想法!

+0

許多現有的問題涵蓋了這一點。 DUP。 –

+0

[Google App Engine超時?]的可能重複(http://stackoverflow.com/questions/7328582/google-app-engine-time-out) –

回答

1

兩個選項:

  • 使用的MapReduce庫爲App Engine運行在所有的實體。而在MapReduce的地圖的一部分中,你要對每個實體做一些神奇的事情。教程可以在這裏找到:MapReduce on App Engine made easy
  • 或者,使用具有有限查詢大小的遊標和任務。 I.E.您的cron作業將運行第一批或多個實體,並且如果剩餘的任務將使用剛剛運行的查詢的查詢光標啓動另一個任務。
1

你還沒有說如果你使用任務隊列,所以我會認爲你不是。

一個cron工作應該啓動一個任務來做你的處理,其他的明智的處理器仍然會有60秒的最後期限。將它作爲一項任務運行將爲您提供10分鐘的截止日期。

考慮您的批量大小,指定大批量的尺寸可減少往返次數。

最後,如果作業長時間運行,您可以鏈接任務(查看您已經運行多長時間並開始新任務以繼續)或查看mapreduce作業。

+0

cron作業與任務具有相同的截止日期。然而,啓動任務以獲取重試仍然有用。 – Greg

+0

我錯過了限制增加(似乎它只在SDK 1.4發行說明中記錄,據我所知)。我一直有cron啓動任務,因爲任務是可重試的,而cron請求不是。 –