スキップしてメイン コンテンツに移動

[Python][Google App Engine]cronでのレート取得が空振りする

■課題
cronでの定期実行だと1分間が最短になるけど、cronの実行誤差で抜ける現象が発生した。

本来欲しいデータ:
2011-03-30 19:59:55 84.5
2011-03-30 20:00:55 84.3

実際のデータ:
2011-03-30 19:59:55 84.5
2011-03-30 20:01:03 84.5

スポットレートの抜けよりも毎時00分に実行される60分足が作成されなくなってしまうのが一番の問題。

■対策1
レート取得タイミングを2重化して実行誤差を吸収する方法。
結局、キーがMIまでなので、20:00:05も20:00:55も同じ20:00のキーとなるため、第1案はcronを2重化して実行誤差によるレート取得タイミングをそれぞれずらす。

問題:
cronを2重化するため、リクエスト数が2倍。併せてCPU Timeも2倍になる。

■対策2
60分足の作成を毎時00分ではなく、スポットレート取得タイミングで随時更新していく。
スポットレートよりも60分足の優先度が高いため、60分足開始時刻から終了時刻までcron実行タイミング(1分間隔)で60分足のデータを更新する。

問題:
データストアへのアクセスが増大する。

従来:
Model.get() 720回(=60分*12ペア)
Model.put() 12回(=12ペア)

対応後:
Model.get() 720回(12ペア*60分)
Model.put() 720回(12ペア*60分)


■結論
個人的には対策2がいいように思う。
問題は60分足。CPU Timeはたしかに増大するが、(1)60分足が確実に取れる、(2)リアルタイムで60分足が伸び縮みする点がメリットかと思う。

という訳でロジックの変更になる。

コメント

このブログの人気の投稿

[Python]redis-pyでRedis Pub/Sub実装

前から面白そうと思っていたRedisのPub/Sub機能。 redis-pyでどう実装すれば使えるか確認してみた。 ■Pub/Subについて http://ja.wikipedia.org/wiki/出版-購読型モデル ■pub.py from redis import StrictRedis def publish(channel,msg): """ redis-pyにはPUBLISHするためのメソッドがないので、 Redisのコマンドをそのまま実行する為のクラスを使う。 """ sr=StrictRedis() """ 第1引数にRedisのコマンド、第2引数以降は そのコマンドの引数をそのままセット """ sr.execute_command("PUBLISH",channel,msg) if __name__=="__main__": # チャネル"hoge"に"Hello"というメッセージを出版(Publish) publish("hoge","Hello") ■sub.py from redis import Redis def listen(channel): r=Redis() ps=r.pubsub() ps.subscribe(channel) while True: for i in ps.listen(): print i["data"] if __name__=="__main__": # チャネル"hoge"を購読(Subscribe) listen("hoge") ■実行方法・実行結果 (ターミナル1-準備) [user@localhost ~]# python sub.py 1 # => チャネ

[OS]VirtualBoxでCentOS6.5(x86_64)がKernel panicを起こした

完全に対処療法。 恥ずかしながら自分では原因がわかっていない。 忘れないようにメモしておく。 いろいろ設定したあと、何度目かの再起動のタイミングでKernel panicが発生して起動しないという事象が発生。 こちらの方法でなんとか起動させて。 [CentOS] SELinux 無効化後のカーネルパニック http://kuni255.blogspot.jp/2013/04/centos-selinux.html こちらの通り、/boot/grub/grub.confに設定を追加。 Kernel panic – not syncing: Attempted to kill init! http://h2np.net/mynotebook/post/130 設定変更後、以下の操作をそれぞれ10回ほど試した限りでは再発していません。  (1)halt+起動 (2)reboot 追記:と思ったらまた発生した。なんかもう解決できる気がしない。

[Haskell]Database.HDBC.Sqlite3でSQLite3のデータを読む。

関数型言語のHaskellというものに手を出してみました。 今回は、システムトレードで使っているSQLite3からHaskellで時系列データ(日足)を読んでみます。 備忘録として、コードを上げておきます。 import Database.HDBC import Database.HDBC.Sqlite3 main = do conn <- connectSqlite3 "investment.dbf" closes <- getHistoricalPrices conn "2712" "CLOSE" print [zenjitsuhi |(x,y) <- (zip (init closes) (tail closes)),let zenjitsuhi = ((x-y)/y)*100] hist <- getHistoricals conn "8411" print hist disconnect conn return () getHistoricals :: IConnection c => c -> String -> IO [(String, String, String, Double, Double, Double, Double, Double)] getHistoricals conn code = do stmt <- prepare conn "SELECT S.DATE,S.CODE,S.MARKET,S.OPEN,S.HIGH,S.LOW,S.CLOSE,S.VOLUME FROM STOCK_DAILY S,MARKET_LISTINGS L WHERE L.CODE=? AND L.MAIN_MARKET='true' AND L.CODE=S.CODE ORDER BY S.DATE DESC" execute stmt [(toSql code)] rows <- fetchAllRows s