大量のデータを一括でDatastoreに書き込む

あるログファイルを一行ずつデータストアに保存していくプログラムを作成した。
ログファイルをパースするところは問題なかったけど、データストアに書き込むところで時間がかかりすぎ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するには、こんなふうに書く。

class Log(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)