我有一個查詢數據存儲的AppEngine cron作業,然後需要對查詢返回的每個實體做一些工作。預計查詢返回的實體數量有時會很大(> 1000)。查詢結果數量多時使用qry.map_async()是否安全?
我的目標是最大限度地提高併發性並保持較低的內存使用率 - 因爲預期的結果數很大,所以它們可能不適合內存。
由於大#的結果,我應該在它們之間迭代這樣的:
qry = Model.query()
qit = qry.iter()
while (yield qit.has_next_async()):
entity = qit.next()
# Do something with entity
...或者是可以安全使用更快的map_async()對任意大的結果集進行操作?
@ndb.tasklet
def callback(entity):
# Do something with entity
qry = Model.query()
yield qry.map_async(callback)
我讀過所有的文檔,甚至看了看執行的膽量,它不是完全清楚這些操作的侷限性是大的結果集。
使用「yield something_async()」與使用同步API沒有任何改進,除非您的代碼在tasklet中運行(在這種情況下,它仍然不會運行得更快,但其他的東西可以運行在相同的時間)。 – 2012-04-18 00:24:08
另外,「> 1000」涵蓋了很多。它是> 10,000? > 100,000? > 1,000,000?在某個時候,最好的方法會改變。 – 2012-04-18 00:24:47
嗨,尼克,是的,我的代碼運行在一個tasklet中,我意識到它並不是真的「更快」,而是允許其他tasklet同時運行。感謝澄清。 至於實體數量,我預計這個數字可能會高達10,000。 – 2012-04-18 21:21:13