When it’s ready.

出来るまで出来ない

GAEのRemoteAPIを使って大量のEntityを消す。それも素早く

RemoteAPI使ってデータ消してる時に、気づいた。消し方によってはめちゃくちゃ時間がかかる。

以下、実際のShellをペースとして、適宜コメント付けてみる。
今回は転置インデックスの構造を変えたので、以前のデータが要らなくなったので消す作業

# 転置インデックスを数えるとこの段階で554個存在している。
>>> inv = InverseIndex.all()
>>> inv.count()
554L

# デリートにinvを突っ込んでも、一回の操作では20個までしか処理できない。
>>> db.delete(inv)
>>> inv.count()
534L

# 200個を事前にfetchしてそれを、db.delete()してみると 約5秒で処理が終わる。
# スピード 40entity/sec
>>> def hoge():
...   inv = InverseIndex.all()
...   invs = inv.fetch(200)
...   db.delete(invs)
...   print datetime.datetime.now()
... 
>>> print datetime.datetime.now();hoge()
2009-04-01 23:30:27.404161
2009-04-01 23:30:32.308488

# 確かに200個消去されてる。
>>> inv.count()
334L

# 200個事前に取ってくるが、一個ずつdelete()メソッドで消去していくと、4分強掛かる。
# スピード 0.83entity/sec
>>> def fuga():
...   inv = InverseIndex.all()
...   invs = inv.fetch(200)
...   for i in invs:
...     i.delete()
...   print datetime.datetime.now()
... 
>>> print datetime.datetime.now();fuga()
2009-04-01 23:31:56.000327
2009-04-01 23:35:47.112105

# 確かに200個消えている。
>>> inv.count()
134L

db.delete() 使いましょう。
それにしても、400 : 0.83 ってスピード違いすぎるだろ。500倍くらいスピードが違う。