PAGE TOP

取り組み

印刷する

gawkでクロス集計する、その集計時間を計算してみた

さぼ郎


過去、何回かに渡って「gawk」の連想配列を使って単純集計とクロス集計する関数などを検討してきました。

テキスト加工において、かくも簡単に変換したり集計したりできるツールで、「awk」より優れているツールは見当たりません。

その理由の一つに「約束が少ない」事を挙げることができると思います。この「awk」という言語を作ったのが「アルフレッド・イホ」、「ピーター・インバーガー」、「ブライアン・ーニハン」の3人です。

カーニハンといえばC言語やUNIXにの開発などにも関わっていて、そんな発想が生かされていることが、この言語に長い寿命を与えているのだと思います。

かつて、コンピュータの言語といえばFORTRANCOBOLの時代がありました。

FORTRANといえば1954年にIBMで作られた初の高級言語だそうです。実は、進化しながら今でも使われているようですが、初期の面影は殆どないそうです。

COBOLも、実はかなり生き残っているようです。フォーチューン500の企業の中で90%がいまでもCOBOLを使っている(2009年)という報告がwikiに書かれています。

メインフレーム
wiki「メインフレーム」にリンク ↑

ともかく、awkも、FORTRANやCOBOLなどとは異なる使命を持つゆえに今でも十分使い勝手が確保されているような気がします。

「イージー」なこと。これが真骨頂な言語だと断言できます。

以前に連想配列を使った単純集計とクロス集計をするための関数を公開しています。1400万件のデータに対して出現頻度や販売金額などを集計してみました。

グロスの時間を票数で単純に割って、速さを示していましたが、よく考えてみると、「福島支店,04M,L,2900,60,男,福島県」というデータを1行取り込むと、まず、「カンマ(,)」で分断してそれぞれを「$1」~「$7」という変数として使用できるようにします。

このことは単純集計であろうがクロス集計であろうが同じことなので、「取り込み処理」と集計処理を分けて考えてみます。

クロス集計1表と2表の集計時間が17.38秒と27.64秒でしたので、
1x+n=17.38
2x+n=27.64
これを解くと、
x=10.26 ←クロス集計時間
n=7.12  ←集計前処理時間
となります。

1460万件にデータに対して
集計前処理時間 : 7.12秒
クロス集計1表  : 10.26秒
1460万件のデータに対して です。

つまり、1460万件の取り込み前処理(1行のテキストデータを読み込んでセパレータに従って分断し変数に代入する処理のこと)にかかる時間が「7.12秒」で、クロス集計1表作成するのにかかる時間は「10.26秒」ということになります。

6表のクロス集計をすると、計算上は「68.68秒」となり、ストップウォッチ計測の72秒との誤差は約3秒です。この「3秒」は、出力時間と考えられます。

1億4千万件だったら、クロス集計1表作成するのに要する時間は102.6秒+71.2秒。「約174秒」。3分弱が予想されます。6表だったら、「11分30秒」程度ということが推定されます。

awkはストリームエディタと言って1行読み込みながらエディットしていくので、1億件あろうが10億件あろうが、メモリリークする心配はありません。

並列処理などという洒落たことはできないので、事前に分散して再集計するなどの細工をすれば、単純集計とクロス集計に関しては、高いソフトは不要だということです。

ただし、統計ということになると、あれやこれやの数式が出てくるので、こうなると専用の統計処理ツールのお出ましになりますが、千万件、億件となると価格も天井知らずになることは避けようもありません。

ただ、母数が大きくなれば正確な分析ができるかと言うと、それは違うと思います。そこにデータが有るということは、それのデータは間違いなく「過去」のものでしかありません。

そこから「未来」を語るとするなら、データの量は決して多い必要はないと思います。ビッグデータの真骨頂は、そこからどれだけの多様性を見抜き、多様性の個々の特徴に対して「1 to 1」の傾向分析と予測の精度が向上することから価値を生み出すことに尽きると思います。

では、なぜ、このところ「gawk」を使った1460万件のクロス集計などに夢中になっていたのかと言うと、テキストデータで台帳管理ができるなら、ブロックチェーン化することでデータベース不要の情報管理ができるように思えるからです。

ファイルチェーン

CADのデータの持ち方に近似しています。左端の「レイヤー」はおそらく階層構造になると思います。「年度」+「組織」のように。

分散が適正であるなら、年度あたりの1レイヤーに連なる台帳データは、せいぜい、数千あるかないか程度ではないでしょうか。

暗号復号を繰り返したとしても、耐えられる時間内での処理が可能であるなら、システム費用はわずかで、メンテナンス費用は不要にすることができるのではないかと思っています。

チェーン

今年は、この可能性をたどってみようと思っています。

キーワード