Blog ブログ
実際にKPI集計時に発生した問題と解決方法のご紹介
皆様お久しぶりです。CCSプログラマの吉村と申します。
突然ですが、皆様KPIはご存知でしょうか?
KPIとは・・・重要業績評価指標(じゅうようぎょうせきひょうかしひょう)
”企業などの組織において、個人や部門の業績評価を定量的に評価するための指標。達成すべき目標に対し、どれだけの進捗がみられたかを明確にできる指標が選択される。これをもとに、日々の進捗把握や業務の改善などが行われる。”
上記説明にあるように、ソーシャルゲームを運営していく上でもKPIは、
そのアプリの方向性を決めるほど重要なものになります。
今回はそのKPIの集計を行った際に、
実際に発生した問題点と解決策をいくつか紹介したいと思います。
1.GROUP_CONCATで取得した値が欠落
まず初めに、ユーザの集計を行う際に、ある条件に合致したユーザIDの一覧を取得する必要がありました。
そこで使用したのが、mysqlのGROUP_CONCATになります。
GROUP_CONCATを使用すると複数レコードを1行にまとめて、取得出来るようになり、
その取得した値をIN句などで使用すれば、指定したユーザから情報を取得出来るようになります。
それにより、条件に一致したユーザIDを取得し、そのユーザIDを対象にした情報を集計する処理を作成しました。
ですがここで、一点問題が発生しました。
それは、集計された値が明らかに少ないというものでした。
原因を調査した所、GROUP_CONCATには、文字数制限があり、デフォルトでは1024に設定されている為、上限を超えた場合、途中で文字が切り捨てられてしまいます。
その為、本来集計するはずのユーザ数より少ないユーザから集計を行う事となり、
情報が欠落してしまっていました。
■解決策 group_max_lenの設定を変更
GROUP_CONCATの文字数制限は、group_max_lenの設定を変更する事で変更する事が出来ます。
取得するデータの文字数がオーバーしてしまいそうな場合は、あらかじめ上限を変更しておくようにしましょう。
2.集計時のメモリ不足
集計をバッチにより、毎朝一定の時間に集計されるよう、設定していたのですが、
ある日、一部集計のみ行われていないという問題が発生しました。
原因を調査した所、phpのメモリ不足により、集計処理が途中で失敗しているという事が判明しました。
■解決策 メモリの上限を変更
phpでは、ini_setを使用する事により、メモリの上限値を変更する事が出来ます。
メモリオーバーが発生しそうな場合は、メモリの上限を変更しておきましょう。
また、無駄な変数などは、unsetを使用し、メモリの節約を行いましょう。
3.まとめ
いかがでしたでしょうか?
今回紹介した2つの問題は、どちらも基本的な設定が原因でした。
ですが、基本的な事だからこそ、重要な箇所でもあります。
皆様も設定については、同じ失敗が起きないよう、十分に注意して行いましょう。