ダウンロードしたい Google App Engine アプリに 160 万のエンティティがあります。組み込みのバルクローダー メカニズムを使用してみましたが、非常に遅いことがわかりました。バルクローダー経由でダウンロードできるエンティティは 1 秒あたり最大 30 個ですが、バックエンド経由でデータストアにクエリを実行すると、1 秒あたり最大 500 個のエンティティをダウンロードできます。60 秒のリクエスト制限を回避するには、バックエンドが必要です。さらに、データストア クエリは最大 30 秒間しか存続できないため、クエリ カーソルを使用して複数のクエリにフェッチを分割する必要があります。
サーバー側のコードは、1000 個のエンティティをフェッチし、クエリ カーソルを返します。
cursor = request.get('cursor')
devices = Pushdev.all()
if (cursor and cursor!=''):
devices.with_cursor(cursor)
next1000 = devices.fetch(1000)
for d in next1000:
t = int(time.mktime(d.created.timetuple()))
response.out.write('%s/%s/%d\n'%(d.name,d.alias,t))
response.out.write(devices.cursor())
クライアント側では、最初に null カーソルを使用してサーバー上のハンドラーを呼び出し、前の呼び出しで受け取ったカーソルを渡し始めるループがあります。空の結果を取得すると終了します。
問題: このメソッドを使用しているエンティティの約 20% しか取得できません。エンティティの完全なセットがトラバースされていないにもかかわらず、空のデータを含む応答が返されます。このメソッドがすべてを包括的に取得しないのはなぜですか?