風柳メモ

ソフトウェア・プログラミング関連の覚書が中心

GAEのDatastoreのエントリ削除していたらOver Quotaになった…

いつの間にかこれのDatastoreのエントリのサイズが380MB程になってquota limitに陥り(それにしても、Datastore Statisticsで見る限り、全てのデータを合わせても400MBしかないのに、なぜquota limitになるのだろう?Free Quotaでも1GBのはず…)、こちらがうまく動かなくなっていたみたいなので、思い切って前者のデータをDatastore上に持つのを止めにして、全部削除しようとしていたところ……

CPU Timeが6.50CPU hoursを使い切ってOver Quotaになってしまいました(哀)。

どうしてこうなった

削除処理としては、

entries=dbClassName.all().fetch(500)
db.delete(entries)

のような処理をtaskqueueで順次呼び出すというシンプルなもの。

ところが、ログで確認する限り、500件削除するだけで、200000cpu_ms=200cpu_sec前後かかっており…ということは、Free Quotaの範囲の1日辺りのCPU Time=6.50 CPU hoursだと、単純計算で、

6.50 CPU hours→23400cpu_sec
500件×23400cpu_sec/200cpu_sec=58500件

のように、6万弱のエントリ削除でOver Quotaに陥ってしまうことになります。

うーん、あと倍近くあるんだけれど…cronで30分間隔くらいで呼び出すようにするか…?

他の方法は?

面倒なのでこれまでちゃんと調べていませんでしたが、remote_apiとかDatastore Adminの機能でもエントリを削除することは出来るみたいですね。

ただ、どちらもQuotaにカウントされるみたいなので、通常のアプリでやるのとどれくらい違うかというと疑問がありますが…実際のところどんなものなのでしょう?
追記→GAEでremote_apiを使う場合の覚書 - 風柳メモ。ちなみにQuotaの消費はアプリでやるのとほとんど変わらなかった。

Requests to remote_api use quota
Since remote_api operates over HTTP, every datastore call you make incurs quota usage for HTTP requests, bytes in and out, as well as the usual datastore quota you would expect. Bear this in mind if you're using remote_api to do bulk updates.

Accessing the datastore remotely with remote_api

Warning! Deleting entities in bulk happens within your application, and thus counts against your quota.

Deleting Entities in Bulk

DatastoreのQuotaだけ換算されて、CPU Timeを使わないというならうれしいですが、そう甘くは無さそうな気がするしなぁ…。

特に後者の場合、entity kindを指定して一括削除出来るのだけれど、操作中にquota limitになったらどうなるんだろう…?