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倍くらいスピードが違う。