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

投稿

3月, 2011の投稿を表示しています

[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][Google App Engine]為替レートのCSVダウンロード

下記のようなCSVの提供は既に開始している。 初めてGAEに触っていたときに作ったもの。 http://forex-archive.appspot.com/dlcsv ■処理内容 cronでhttpリクエスト自動実行 データセットへの保存 memcacheでのCSV(テキストデータ)のキャッシュ cronでCSV化したデータを改廃 ■課題 ファイルが1日単位 取引時間外も取得、保存している スポットレートしか保持していない 画面が味気ない 機能が乏しいから画面が味気ないのは仕方ない。

[Python][Google App Engine]データストアへのアクセスを減らす方法

データストアへのアクセスを減らすためにやっていること。 ■保存する方法 データストアへの保存を避けることはできないので、取り出すときに備えて取り出しやすいようにした。具体的には以下。 データストアのエンティティには必ずkey_nameを指定する memcacheにデータストアのkey_nameと同じkeyでデータを保存する memcacheにkey_name+'_KEY'で保存したエンティティのkeyオブジェクトを保存する ■取得する方法 保存時にやったキャッシュをできるだけ使う。これでアプリケーションのレスポンスとCPUリソース消費の削減につながる。 取得対象となるデータのkey_nameをPythonのロジックで生成する memcache.get()の引数に生成したkey_nameを指定してデータを取得する memcache.get()の引数に生成したkey_name+'_KEY'を指定してデータストアのkeyオブジェクトを取得し、Model.get()の引数に指定してデータを取得する Model.get_by_key_name()の引数に生成したkey_nameを指定してデータを取得する 当初はQueryクラスを使ってデータを取得しようとしたが、indexを利用したとしても件数が増えるとそれだけ遅くなるので、直接エンティティのkey_nameでアクセスするように変更した。 ただ、memcache.get()+Model.get(keyオブジェクト)とModel.get_by_key_name()でどちらが軽いのかは調べていない。get(keyオブジェクト)はデータストアに直接アクセスするが、get_by_key_name()はkey_nameから実際のkeyオブジェクトを取得して、そのkeyオブジェクトを使ってデータストアにアクセスするようだ。 memcacheの揮発を回避するための対策なので、memcacheのQuotaが逼迫するようであればmemcache.get()+Model.get(keyオブジェクト)を削除する。

[Python][Google App Engine]為替レートを取得、保存する

今、自分がつくっているプログラムのメモ。 FXの為替レートを取得していくつか移動平均と標準偏差を計算するもの。 1日あたり 1440分× 12ペア/分 = 17,280件のエンティティ(RDBで言えばレコード)が作られる 取引時間中は1分間隔でスポットレートを取得して保存する 60分移動平均、60分足、日足をスポットレートから算出して保存する こんな感じ。 最終的にはもうちょっと複雑なテクニカル指標を算出できるようにしたい。