このブログを検索

ラベル task の投稿を表示しています。 すべての投稿を表示
ラベル task の投稿を表示しています。 すべての投稿を表示

2013/06/04

ブラウザからインストール状態に応じてアプリ起動かストア起動

mongoDBやPHPと全然関係ないが、
とりあえず仕事で使うからメモる。

以下のサイトに方法があるから
試してみてその結果を残します。

http://blog.maruware.com/?p=45
->iPod touch(iOS6)とGalaxyNot2で試した結果、次の1点以外はうまく動いてくれた。
 ・アプリが無い時に、iOSのsafariは「無効なアドレスです。」のポップアップが表示された後にストアへ遷移される。

http://subtech.g.hatena.ne.jp/cho45/20110221/1298267067
->アプリの対策が必要ようだが、今回アプリは触れないのでテスト出来なかった。

2013/02/20

mongodbはHDDの容量が大きい

わけが有り32bitOSでKPI取得ツールを作成して運用中。
が、1ヶ月も立ってないのにstorage sizeが200M超え(Rockmongoから確認)!!

MySQLからCSVにしたデータは何M(何十M?)のはずだが
MongoDBは結構食う。

急ぎで作った(かつ、知識もなかった)から
英字で10文字以上のフィールド名をそのまま利用したり
CSVからのImportなので年月日と時分秒をそのまま文字として保持してる部分はある。
が、それでも怪しいので一段落したら調べる。

2013/03/05追記
CSVファイル容量の約2.5倍のDataSizeを食う事が分かった。
上のようにField名の工夫をしてない、日付をStringとして格納、
_idをObjectIdではなく個別にしてするなどの理由はあるがそれでもよりサイズが大きい事がわかった。


【容量記録】
| 日付 |SIZE | StorageSize | DataSize | Index Size |Objects | CSV size |DataSize増減|
| 2013/02/20 |-| 200m程度  | - | - | - |- |
| 2013/02/21 |1000m程度|294.52m | 209.55m | 18.4m | -|23m | -|
| 2013/02/22 |1023.75m| 387.91m | 258.68m | 22.8m | 862,368 |19m|49.13m|
| 2013/02/25 | 1.5G | 513.77m | 375.49m | 33.8m | 1,248,860 |46m |116.81m|
| 2013/02/26 | 1.5G | 514.54m | 404.36m | 33.15m | 1,344,394 | 12m |28.87m|
| 2013/02/26※1 | 1.5G | 170.60m | 127.56m | 11.45m | 453,500 | - |-276.8m|
| 2013/02/26※2 | 1.5G | 288.78m | 227.88m | 20.12m | 733,270 | 41.4m |100.32m|
| 2013/02/27 | 1023.75m | 320.09m | 242.35m | 26.96m | 789,443 | 13.7m |14.47m|
| 2013/02/28※4 | 1023.75m | 365.41m | 261.58m | 29.73m | 864,312 | 12.2m |19.23m|
| 2013/03/01※3  | 1.5G | 355.66m | 260.32m | 51.85m | 840,641| 4m |-1.26m|  

※1:02/26に不要と判断したcollectionを3つDropして、Importしないようにした。
| Collection | StorageSize | Index Size | Objects | lastExtentSize|
| log_rxxxx |166.64M | 13.8M | 571,957 | 48.45M |
| log_s_xxx |166.64M | 7.29M | 300,781 | 48.45M |
| t_c_xxxxx |10.6M | 0.58M | 18,246 | 8M |

※2:41.4mのCSVファイルを新規にimportして「_id」を指定する時としない時の容量を比較したが、
ObjectIDにしたほうが少し小さかった。
| Collection | StorageSize | Index Size | Objects | lastExtentSize|
| t_u_xxxxx  | 118.18m | 8.67m | 279,767 | 35.88m |:_idをObjectIDにした
| t_u_xxxxx  | 118.18m | 9.72m | 279,767 | 35.88m | : _idをIntにした

 ※3 約30万Objects程のcollectionに対してindexに_id以外に2パータンを追加した。
  totalIndexSizeが37.55mだった。複数キーのindexはサイズも大きい!!

 ※4 2m程はupdateされるデータ、不要ログの削除処理を追加

2013/02/08

TASK#2 PHPで年月日でGroup byしてカウントする方法


SELECT DATE_FORMAT(  `create_date` ,  '%Y/%m/%d %H:00:00' ), COUNT(user_id)  FROM user_table GROUP BY DATE_FORMAT(`create_date`, '%Y%m%d %H') の実装方法

(1)mapreduceでjavascriptのdateformatを使って文字列を日付に変換させようとしたが、次のエラーが出て失敗。
exception: map invoke failed: JS Error: ReferenceError: DateFormat is not defined nofile_b:1

CSVでデータをImportしたときは 
日付のGroup Byをしたい場合は「年/月/日/時/分/秒」等で分類して持った方がやりやすいかも。

 
(2)Mapreduce関数を利用した(Scopeも利用した)
// get yyyyMMddのScope機能も利用
$scopeFunction = "function (y,m,d) {
        if ( m < 10) {m = '0' + m;}
        if ( d < 10) {d = '0' + d;}
        return y + m + d;
    }";

$scope = new MongoCode($scopeFunction); // MongcodeでScopeを利用

// map 関数と reduce 関数を作ります
$map = new MongoCode("function() {

    var group_key = getYyyyMMdd(this.create_date_y,this.create_date_m,this.create_date_d);
    
    emit(group_key,1); }"); //GroupByのcreate_dateになるキー

$reduce = new MongoCode("function(k, vals) { 
    var count = 0; // 初期化
    for (var i in vals) {
        count += vals[i]; //count up
    }
    return count; }");
// phpのCommandで実行
$result = $db->command(array(
    "mapreduce" => "collection", 
    "map" => $map,
    "reduce" => $reduce,
    "scope" => array("getYyyyMMdd"=>$scope), // この設定に注意
    "out" => array("replace"=>"new_user_daily_count")
 ));

$cur_daily_counts = $db->selectCollection($result['result'])->find(); 

2013/02/06

TASK#1 MySQL -> mongodb

1. Export does User Data of MySQL in CSV.
( use "select * from table_name into outfile "path/to/export.csv" fields terminated by ',';)

2. I used "mongoimport".

CSV file
user_id, user_pw , name <- header
10, test_pw,名前1 <- row
20, test_pw,名前2 <- row

$ mongoimport --db bad_kpi --collection {CSV file name} --type csv --file {csv path} --headerline --upsert

in mongo
{"_id":ObjectID(xx1), "user_id":10, "user_pw":”test_pw”, ”name”:”名前1"}

{"_id":ObjectID(xx2), "user_id":20, "user_pw":”test_pw”, ”name”:”名前2"}

【参考】
(1)primary keyがひとつであれば”_id"に書き換えて出力するとmongoimportの--upsert だけで重複更新を防げる。
(2)更新されたデータのimportも--upsert を指定すると_idが一致するだけで更新される。

【注意点】
(1)CSVからのdate型のimportはやはり出来なかった。- ISODateを指定したらdateの文字になる。
−{"$date" : 111111111} はエラーとなる。
(2)ISODateの入力ができないから年月日をバラバラにしていれたら数字になった。
例)CSV -> mongodb
date_m : ”02” -> "date_m" : 2