2

3分ごとに実行するcronジョブがあります。これは、リモートAPIからデータを取得し、それをローカルデータストアに保存します。ただし、これにはデータストアの書き込み操作に膨大なCPU時間がかかります。私はおそらく、多くの最適化が可能な本当に愚かなことをしているのではないかと思います。

result = urllib2.urlopen(url).read()
foos = json.loads(result)['foo']
bars = json.loads(result)['bar']

models = []
for foo in foos:
    d = FooContainer()
    d.Property = foo.Value #in real code, this is setting a load of values based off foo     
    models.append(d)

for bar in bars:
    d = BarContainer()
    d.Property = bar.Value #in real code, this is setting a load of properties based off bar
    models.append(d)

db.put(models)

ご覧のとおり、新しい「行」として返されたすべてのデータをローカルデータストアテーブルに保存しています。このcronジョブで使用される膨大なデータストアのCPU時間を削減するために使用できる手法はありますか?

4

3 に答える 3

6

〜2kのcpu_msはほぼ正しいように見えます。データストアが書き込むことができるのは最大数のみであるため、 46kのcpu_msがapi表示されています。1秒あたり10エンティティ(APIによって管理されます)で、450以上のエンティティを書き込んでいるため、450+/10約46kcpu_msになります。

使用api量は、クォータの収益に直接カウントされません。最大2,000のみがカウントされますreal。だから心配しないでください、あなたは大丈夫です。

于 2011-05-17T13:16:53.290 に答える
1

入れても大丈夫です。間違いを犯す唯一の方法は、RPCを使いすぎることです。すでに1つだけ使用しています。

1つのリクエストハンドラに最大400のエンティティを保存すると、コストがかかります。最適化を検討している場合は、本当に多くのエンティティを一度に保存する必要があるかどうかを自問します。cronジョブをより頻繁に実行して、より小さなバッチを返すことができますか?実際には、行ごとに1つのエンティティが必要ですか、それとも、より少ないエンティティとListPropertyで同じことを実現できますか?あなたの質問には、実用的なアドバイスを提供するのに十分な文脈がありませんが、それは考慮すべきことです。

于 2011-05-17T14:41:47.493 に答える
-7

他の人のプロセスに優しくするために使用niceしてみましたか?

http://en.wikipedia.org/wiki/Nice_%28Unix%29

また、一括挿入を行っていることを確認してくださいが、そう思われます。

于 2011-05-17T09:43:17.073 に答える