11

私のアプリでは、実行するバッチ操作がいくつかあります。残念ながら、これは 400 ~ 500 個のエンティティを更新するのに永遠にかかることがあります。私が持っているのはすべてのエンティティ キーです。それらを取得し、プロパティを更新してデータストアに保存する必要があります。保存には最大 40 ~ 50 秒かかりますが、これは探しているものではありません。

私のモデルを単純化して、私が何をしているのかを説明します (とにかく非常に単純です):

class Entity(ndb.Model):
    title = ndb.StringProperty()

keys = [key1, key2, key3, key4, ..., key500]

entities = ndb.get_multi(keys)

for e in entities:  
    e.title = 'the new title'

ndb.put_multi(entities)

取得と変更にそれほど時間はかかりません。タスクレットで get_async を取得しようとしましたが、get または forloop に時間がかかる場合にのみ変更される可能性があります。

しかし、本当に気になるのは、プットに最大50秒かかることです...

この操作を適切な時間内に実行する最も効率的な方法は何ですか。もちろん、エンティティの複雑さなどの多くの要因に依存することはわかっていますが、配置にかかる時間は実際には許容範囲を超えています.
私はすでに非同期操作、タスクレットを試しました...

4

3 に答える 3

8

たとえば、50 個または 100 個のエンティティの小さいバッチを実行する方が高速になるのではないかと思います。それをタスクにすると、それらのタスクレットを同時に実行してみることができます。

また、 Appstatsでこれを調べて、驚くべきことが示されているかどうかを確認することもお勧めします。

最後に、これが HRD を使用すると仮定すると、バッチごとのエンティティ グループの数に制限があることがわかる場合があります。この制限のデフォルトは非常に低く設定されています。上げてみてください。

于 2012-04-17T04:54:54.507 に答える
0

私はあなたがあなたが望むエンティティデザインを持っていると仮定します(つまり、あなたが何をしようとしているのか、そしてあなたが常に更新する必要があります)。それはあまりいいことではないからです。(=

タスクキューを使用した場合はどうなりますか?複数のタスクを作成でき、各タスクはURLパラメータとして、更新を担当するキーと、設定する必要のあるプロパティと値を取得できます。そうすれば、作業は管理可能なチャンクに分割され、作業がバックグラウンドで行われている間、ユーザーの要求はすぐに返されますか?それはうまくいくでしょうか?

于 2012-04-16T23:11:39.320 に答える
0

MapReduce が設計された目的のように思えます。複数のサーバー インスタンスにまたがってスケーリングされたすべてのエンティティを同時に取得および変更することにより、これを迅速に行うことができます。ただし、より多くのインスタンスを使用するとコストが上がります。

于 2012-04-16T20:32:39.377 に答える