2010年4月26日月曜日

app engine で、大量のデータを、あっと言う間に、datastoreに入れる方法

ググる限りは、言及しているページが非常に少ないので、
「知る人ぞ知る」化してるっぽいので、書いておきます。

google.appengine.ext.db.Model.put()
google.appengine.ext.db.Model.delete()

datastoreのレコードを更新するときには、
db.Modelのput/deleteを使う場合がほとんどだと思いますが、
これって遅いですよね?

datastoreとの通信は、xml-rpcっぽいので、
ほとんどはプロトコルのオーバーヘッドだと思います。
たとすれば、通信回数を減らせば良い?

そうです。一括書き込み方法があります。
って言うか、ドキュメントを熟読すれば書いてある話なんだけど。

「一つ以上の」って書いてあります。
ハイ。もう判りましたね。

db.Modelをその場でputしないで、
  • list.appendしておく。
  • まとめて、db.put(list) する。

これだけで劇的に速くなります。
もう劇的です。500レコードが2秒で入ります。

「な!」と言っちゃうぐらいです。

ただしこの場合だと、db.Model.putは通らないので、
独自にputをオーバーライドしてる場合だと、
都合が悪いことがあります。

ちなみに筆者は、まったくの別件の研究で、
SDKのソースを眺めていて、本件を発見しました。