あるログファイルを一行ずつデータストアに保存していくプログラムを作成した。
ログファイルをパースするところは問題なかったけど、データストアに書き込むところで時間がかかりすぎTimeOutエラーに。
データストアへの書き込み方がfor文で一行ごと読みこんで.putで一行ごとデータストア書き込んでいく方法だったので、これをリスト全部を一括で書き込む(.put)方法へ変えた。
参考にしたのは「雲の上のクラスタ: Google App Engine Python NDB を使ってみた。(2)」にある次の内容。
・複数のキー、エンティティを処理する。
get(),put()はRPC呼び出しを行っているので、ループを使って処理するしかなく非効率だったが、下記のメソッドで速くできる。
list_of_keys = ndb.put_multi(list_of_entities) list_of_entities = ndb.get_multi(list_of_keys) ndb.delete_multi(list_of_keys)
上記コードにある「list_of_entities」はNDBのオブジェクトがリスト型で入っている必要があり、NDBのオブジェクトは次のコードで作成する。
sandy = Account(username='Sandy', userid=123, email='sandy@gmail.com')
ということで、リストに入った連想配列からデータを抜き出して、DNBオブジェクトに入れてそれをまたリストにしてput_multiするには、こんなふうに書く。
classLog(ndb.Model): datetime = ndb.DateTimeProperty() text = ndb.TextProperty() level = ndb.TextProperty() list_of_entities = [] for line in logdata : record = Log( datetime=line.datetime, text=line.text, level=line.level ) list_of_entities.append(record); list_of_keys = ndb.put_multi(list_of_entities)