10

でエンティティのバッチを取得、変更、配置する最も効率的な方法は、私はいくつかのバッチ処理を実行します。 残念ながら、これは時々、400-500のエンティティを更新するために永遠に必要です。 私が持っているものはすべてエンティティキーです、私はそれらを取得し、プロパティを更新し、データストアに保存し、それらを保存することが何を探しているものではない40~50秒かかることがあります。私のアプリでndb

は病気(とにかく非常に簡単である)私は何をすべきかを説明するために私のモデルを単純化:

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秒までかかることである...時間のまともな量で、この操作(複数可)を行うための最も効率的な方法は何か

。もちろん、私はエンティティの複雑さのような多くの要素に依存していることを知っていますが、それを置くのにかかる時間は本当に私にとって許容可能な限界を超えています。
私はすでに非同期操作、タスクレットを試していました...

答えて

8

例えば50または100個のエンティティのより小さなバッチ処理を高速化することができますか?それをタスクにすると

これをAppstatsと見ることで、これが驚くようなものかどうかを確認することもできます。

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

+1

すべてのエンティティが同じエンティティにありますいくつかのテストの後で、タスクレットを使用してエンティティを遅延タスクの中に50でバッチすると、この操作はずっと迅速になります。私が心に持っていたものではなく、50秒よりもずっと優れている完全な更新について約5~10秒間話しています。 – aschmid00

+1

私はこれが驚くべきことだと思います。彼らがすべて同じグループにいれば、異なるバッチを持たないので、あなたは1書き込み/秒/グループの上限に達するでしょうか? – Alexis

+0

1バッチ/秒の音が彼が得ていることについて... –

0

MapReduceが設計したもののような音です。複数のサーバーインスタンスにまたがってスケーリングされた同時に、すべてのエンティティを同時に取得して変更することで、これを高速に実行できます。あなたのコストは、しかし、より多くのインスタンスを使用して上がる。

+0

これはオンデマンド操作です。 mapreduceが私の質問のアンカーなのかどうか分からない。私は間違っているかもしれません。 – aschmid00

+0

「オンデマンド」と言えば、「HTTPリクエストが開始されましたか?それはあなたがmapreduceを使うのを妨げるものではありません。しかし、すべてが完了したときに結果を確認するのは少し面倒ですが、不可能ではありません。 – dragonx

+0

はいHTTP要求が開始されました。アクション/操作が成功したかどうかを確認する必要があります。 – aschmid00

0

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

タスクキューを使用した場合複数のタスクを作成し、各タスクが更新を担当するキーと設定するプロパティと値をURLパラメータとして取り込むことができます。

+0

I * think * MapReduce APIは基本的にこれを行います。それはあなたの仕事を取り、それを複数のタスクにバッチして、並行してタスクを発行します。これにより、タスクはより迅速に完了します。 – dragonx

+0

エンティティの設計は議論の余地があります。はい、私はタスクを設定することが大切ですが、オペレーションがトラフになったかどうかわからないような問題があります。すべてのエンティティが同じエンティティグループに属しています。 )バッチで競合の問題を引き起こす可能性があります...私はまだ何百ものエンティティを話すのではなく、エンティティの束を入れてバッチを実行するのに1分ほどかかります。これらはバックグラウンドタスクではなく、ユーザーによって実行されるアクションなので、アクションがすぐに失敗するかどうかを知る必要があります。 – aschmid00

+0

AppStatsの使用に関するGVRのヒントはおそらくあなたにとって有益です。エンティティの1つを配置するときに書き込まれるインデックスの数はいくつですか? DB書き込みは何回ですか?少し古くなるかもしれませんが、エンティティの1つを配置するのに時間がかかる理由をこの記事で確認してください:https://developers.google.com/appengine/articles/life_of_write –