超言理論

特に益もない日記である

ReadとWriteと時々Index

Google app engineの色々

 Out of Preview Version がリリースされてから挙動不審な@Yorihimeですが、何となくその原因が掴めてきました。結構ハマった所もあるので所々メモ代わりに軌跡を残しておきたいと思います。

Datastore Read Operationsがlimitedになる問題

 もともと@Yorihimeは「マルコフ過程で文章を生成する際、過程が一段階進むごとに新たな形態素を検索している」という状態でした。
これは、例えばDatastoreから「一つ前の形態素は"○○"で、その前の形態素は"××"の"△△"という話題情報を持った形態素を検索する」→Datastoreから「一つ前の形態素は"□□"で、その前の形態素は"○○"の"△△"という話題情報を持った形態素を検索する」→Datastoreから「一つ前の形態素は"▽▽"で、その前の形態素は"□□"の"△△"という話題情報を持った形態素を検索する」→...
という作業の繰り返しであり、マルコフ過程の遷移の回数だけ検索を行っている=長文になるほどDatastore Read Operationsを消費する、という状態でした。
そもそも、生成した文章が1文章あたり平均で10~30個の形態素で構築されるこのアルゴリズムでは1回のツイートのために10~30回のRead Operationが行われており、非常に非効率であり(実際には、文章に多様性を持たせるために微妙に違う条件でも同時に検索をしており、更に話題情報の役割を果たすキーの形態素の数だけ同様の検索が行われていたため、実際には1遷移で10回程度の検索が行われていた)、これだけの頻度でDatastoreの検索を行っていればDatastore Read Operationsが制限に達するのも頷けます。

 そこで今回はDatastore Read Operationsの無料制限圏内にOperation数を押さえるために「先に候補になりそうな形態素を大量に検索しておき、その中でマルコフ過程を行う」という方法に変更しました。多分誰でも思いつきますよね。処理時間はほのかに延びたように感じますが、Operation limitedによって動かなくなってしまうよりマシだとおもいます。
どのくらい変化したのかについてはまた後日確認して報告したいと思います。


Datastore Write Operationsがlimitedになる問題

 これに関しては、全く手立てなし...学習対象となるツイートの閾値を上げて学習頻度を下げてみても、そもそも形態素の書き込みをコメントアウトしてみても、毎回"com.google.apphosting.api.ApiProxy$OverQuotaException: The API call datastore_v3.Put() required more quota than is available."というエラーで弾かれる。そんなにPut()してねーよ!とキレそうにもなりましたが、1日かけてようやく原因を特定。
その原因というのが"Datastore Index"というDatastore中のデータを複数の条件のもと検索するときにお世話になるアレ。これがどう原因なのかと言うと、実は「Datastoreのデータをput()/delete()した際に、それら追加/削除されたデータにあわせてDatastore Indexの更新が行われるため、IndexKeyのみでなく全てのプロパティ分だけ更新の書き込みが行われる」というもの。つまりこれは「データ追加したり削除したりすると、そのデータが持ってる変数の数だけDatastore Indexの更新するからDatastore Write Operations使用するよ。単純にOperation数ってput()/delete()を呼び出した回数じゃないよ。」というもの。それも、例えば5要素の変数を持つデータをput()/delete()すると、データそのものの更新で1Ops、IndexKeyの更新で1Ops、データの持つ5要素についてそれぞれIndex(昇順と降順の2種類)の更新を行うので5×2Opsで総計して12Opsの書き込みが発生する。
 この事実に全く気がつかずに「古い形態素データを100個と、学習参考度の低い形態素データを100個削除するcron」を回していたら、それの存在によって大量のDatastore Write Operationが発生していたという状態。これの対策をとったときには既にlimitedになっていたため、本当に削除cronが原因かは分からないけれど、これ以外には考えられないのでおそらくこれが犯人... 現在はcronの実行頻度を下げ、削除するデータ数も1/10程度に設定してあります。あと、学習の頻度も下げてあります。
明日のQuotas resetを待って、こちらも確認。動くようなら適切なパラメータ調整に入りたいと思います。



全く意味の分からない状態からは脱却できたようなので、とりあえず今日はこれでおしまい。
なんか、このGAE 1.6.0 Updateを機に開発をやめてしまった(理由は課金体系の問題とか、明らかに無料制限内での運用が無理になったとか)人も沢山いらっしゃるようなので、なんか複雑。課金とか考える事になるのかなぁ...と思いながら節約を考える毎日です。


Copyright © 2012-2016 Masahiro MIZUKAMI All Rights Reserved.