SQL による『集合知プログラミング』の実装
『集合知プログラミング』のコードを Oracle の SQL (+PL/SQL) で実装するという意欲的な試みをする人がいた。Oracle Data Mining の開発マネージャである Marcos M. Campos さん。
http://3.1415.jp/sites/default/files/blogger_importer/09/collective-intelligence-1-building-rss.html
<p>『集合知プログラミング』より前は、ビジネス向け、データ解析者向けのデータマイニング本がほとんどであった。開発者向けのデータマイニング技術の本が出たことに感銘を受けて、Oracle の SQL でも実装してみることにした、とのこと。第一回目は、RSSフィードの取得処理まで。</p>
<p>Oracle が XML を扱えることは知っていたが、HTTP も使えるそうだ。</p>
<pre class="prettyprint">
req := UTL_HTTP.BEGIN_REQUEST(url);
resp := UTL_HTTP.GET_RESPONSE(req);
IF (resp.status_code >=400 AND
resp.status_code <= 599)
THEN
res := null;
ELSE
res := httpuritype(url).getXML();
END IF;
</pre>
<p>Oracle なら robust で scalable な集合知実装になる、という前提の元に書いているが、コストを考えずに RAC を使えば、そうなるのかもしれない。しかし、安いサーバを並べて並列処理をするなら、他の方法で実装するほうが、Oracle のライセンスが不要な分だけ、安い。</p>
<p>協調フィルタリングのように、同じ演算を何度も繰り返すような種類の集合知実装なら、SQL での実装も選択肢の一つになりえる。一台の DBサーバで処理速度が間に合う規模のデータと更新頻度に収まっていれば、問題ない。全データをアプリに fetch して、結果を RDB に書き込むよりも、RDB 内部で処理を完結させた方が速そう。</p>
<p>アプリに全データを一気に読み込んで計算すると、メモリが足りるかどうかを気にする必要がある。メモリのことを気にするのは嫌だといって、必要なデータを逐次 RDB から取得すると、javascript:void(0)遅くなる。全て RDB で実装すれば、巨大なデータであっても、中間テーブルに書き出すなどして、RDBMS が適切に処理してくれる。</p>