2009/6/23 Sumio Ebisawa <sebisawa...@gmail.com>
私の知る限り有償版にしてもこの制限値は増えません。
1000件を超えてエンティティを取得したい、その目的はなんでしょうか。目的
がきちんとページングしたいということなら、こちらの pager.py が使えそう
です。
http://bitbucket.org/moraes/appengine/src/tip/gaefy/db/pager.py
1000件を超えたエンティティに対して何らかの処理をしたいという事であれば
新しく出た Task Queue API の使用を検討するのが良いと思います。
Happy coding :-)
-- Takashi Matsuo
このプログラムのままであれば、2 が正解でしょう。
しかも、途中で taskqueue.add のところで Exception が飛ぶんじゃないでしょうか。
会員が 20000 人いるのであれば、「全タスクを 10000 個以下のタスクに分割する。
ただしひとつのタスクは 1 リクエストレスポンスで終わる程度におさめる」
という手がありますが、別の手として「Google に Quota をあげてもらう」という手もあるかもしれません。:-p
task queue を最大限に使い切ると、10 parallel で平均 1000 回繰り返すので、ひとつのタスクが 30 秒程度の
処理だったとすると、8 時間まわりっぱなしになります。
と、ここまで書いてから改めて話の流れを見直したのですが、1000 件の制限というのは、
db.GqlQuery.fetch() / db.Query.fetch() の制限を指していますよね。
fetch() は、エンティティとして全てのプロパティが揃った状態のデータを準備するので
処理負荷を鑑みて 1000 件の制約が入っていると推測しています。
フルセットのエンティティ 1000 件を毎回メモリにロードしないと処理できない、というのは
ちょっと…頭を冷やして…なんとかしてください、というところなのでしょう。
fetch() を使わないのであれば、1000 件の制約は特にないはず。
全てのプロパティが揃っていなくてもいいのであれば、「インデックス」と「キー」だけで計算するのが効率がよくて、
実際 "SELECT __key__ FROM Hoge WHERE ...." というクエリで 2500 件ぐらいの key を
取り出したりしていました(この処理自体ではエンティティを生成していません)。
# 後はこのキー一覧をプログラムに埋め込んでしまうなり、str() にしてから memcache に
# json.write() してしまうなりすると、処理効率がいいです。
task queue に突っ込むには key だけでいいはずなので、こんなやり方が向いていると個人的には思っています。
http://code.google.com/intl/ja/appengine/docs/python/datastore/queriesandindexes.html#Queries_on_Keys
いずれにせよ、もしよろしければ実際にやった結果を教えていただけると、ありがたいです。