tuneoの日記: 鶏を割くに焉んぞ牛刀を用いん 12
日記 by
tuneo
コーダーとしてちょっとしたPython?スクリプトを作らないといけないのだが、なんだかえらいひとが決めた道具立てがやたら重厚長大な模様。
有償ソフトのライセンスマネージャのログファイルをパースして、ライセンスの稼働率を集計するスクリプトなのだが、すべてデータをメモリに載せたらそこらのパソコンではメモリが足りないらしい(そりゃそうだ)。
じゃあ一行ずつ逐次で処理すりゃいいじゃんか、と考えるのが普通の発想なんだが、出てきた道具立ては「ログファイルを頭からお尻までパースして、読み込んだデータをリレーショナルデータベース様の表に入れ込み、SQLの集計関数で集計する」だった。
別の表とのリレーションがない、ただの「表」を1枚作って集計するのにRDB使うんか?しかもSQLの集計関数だってやってることは逐次で集計してるだけだぞ?ちょっと俺には理解できない発想だなぁ。
うーんと (スコア:2)
SQLしかできない人が将来機能追加できるようにとか…
Re: (スコア:0)
RDB の「リレーション」って表と表の関係性(だけ)じゃなく,「列の組」のことなんだよね。だからただ1枚の表でも立派な RDB なんだ。
将来の拡張性を考えるならば,「RDBM で扱えるようにする」と「稼働率を集計する」に仕事を分けるのは,よりシンプルで独立性の高いモジュールに分割しているという点では,そんなに無理な発想ではない。
その案件で,将来の拡張性がどの程度必要かによるけど。
O/T鶏を割く事がそれほど (スコア:1)
大げさな事かなと、牛刀でカボチャをぶっ叩きながら思う。
Pythonすら牛刀 (スコア:1)
昔その手のスクリプトをawkで書きました。
Re: (スコア:0)
私はデータベースを使う方法に賛成ですね
これで例えば
- ログをawkでパース csv に変換 (sedでもできるかも知れない)
- csvをデータベースに書き込む(データベースは sqlite3 COPY文で一発)
- sqlで集計&pythonとかgnuplotで表示
という感じで3つスクリプト or ワンライナーを書きます
実装は超簡単です
たとえばログの書式が
時刻 セッションID ログイン
時刻 セッションID ログアウト
とかだったら
- 時刻 セッションID ログイン
- 時刻 セッションID ログアウト
で2個テーブルをつくって セッションIDでjoinして時刻を引き算
これでログイン累計時間が計算できます
処理の高速化は デ
Re: (スコア:0)
まあ概ね同意。
車輪の再発明を避けられるなら牛刀だろうが食肉加工工場だろうが何でも使う。
なんでもEXCELでやりたがる病 (スコア:0)
と似たようなもんかな?
普通だろ (スコア:0)
仮に有償ソフトのライセンスマネージャのログだとしたら、後から不正ライセンス等が発覚しどの時点からそんなことやってたか調べたくなるかもしれない。
ゆえに一切合切のログをRDBにぶち込んでおくのは当たり前すぎるくらい当然のこと。
逆に何故あんたの仕事だけのスコープでものを語っているのか意味不明で仕方ない。
誰がどう考えてもあんたのやってるライセンスの稼働率を集計するなどという仕事の方がおまけ。
だいたい、
> しかもSQLの集計関数だってやってることは逐次で集計してるだけだぞ?
この時点でもう話にならない。
ポスグレでもなんでもいいからソース読んでみろよ。
そんな単純なことやってるか?
むしろ集計関数だけで何種類のやり方をデータ量などによってやりくりしてた?
冗談はおまえの人生だけにしとけよ。
Re:普通だろ (スコア:1)
へぇ「この集計のためにデータベース入れてため込む」のに、不正監視のためにためておくのが当たり前で、集計処理はおまけなんだ。
面白い冗談だね?
パーサー (スコア:0)
パーサーが組めた時点でほぼほぼ目的達成できてそうな気がするんだが……
集計対象要素をパーサーの中で集計させれば済むんじゃない?
Re:パーサー (スコア:1)
はい、普通に考えればそうなると思うのですが……。
Re: (スコア:0)
どう集計する気か知りませんけどパーサ組めた時点がスタートラインでは?
よほど複雑な形式のログなんでしょうか。