「R言語は本当に実装向きではないのか?— 固定観念を問い直す」と言う記事を見かけたのだが、シングルスレッドだからシステム構築に向いていないと言う主張がされていた。Pythonのウェブアプリケーションもシングルスレッドで使われているわけで、話がおかしい。恐らくシステム構築に関わったことが無い人が書いている。
システム構築と言っても規模や利用者数は様々だが、一定以上の規模か、計算量の多い統計解析であれば、ウェブアプリケーションの記述に使うプログラミング言語と、統計解析に用いるプログラミング言語を分けるべきだ。個人の端末で数秒で処理が終わるものでも、多数のアクセスを同時に捌くウェブアプリケーションの処理としては計算量が重過ぎる。
具体的にどうすればよいか。ウェブアプリケーションからは計算を開始しろと言うメッセージをRのプログラムに投げるだけにして、計算が終わるのを待たない。別に、計算結果が記録されるページを表示するようにする。ウェブアプリケーションとRの連携が必要になり、メッセージが多数同時に生じたときは、一列に並べなおす処理も必要になるが、メッセージ・キュー・サーバーを使えばよい。
簡単に名前無しパイプ(FIFO)でもよいと思ったかも知れないが、RabbitMQ*1のようなメッセージ・キュー・サーバーを用いる方が拡張性が高い*2。ウェブアプリケーションからのメッセージを複数の計算機のRに割り振る分散処理や、複数のウェブアプリケーションからのメッセージの統合ができる。時間起動するバッチから、メッセージを出したってよい。
データサイエンティストが書いたRのコードを大きく変更することなく、システムに組み込むことができるのは魅力的だ。処理部分を関数化し、メッセージに入っている情報にあわせて計算を変える必要はあり、収束しなかったり、シンギュラリティエラーといった異常系の処理をしっかり書く必要が出てくるが、それぐらいはデータサイエンティストもやってくれるはず。
現代的なプログラミング言語であればほとんど全てで出来る方法であるし、メッセージ・キュー・サーバーも今やPythonでの利用が典型例になるので、Pythonに対するRのアドバンテージとはならないが、システム構築にRが使えないと言うのは偏見である。なお、C言語の内部にRを組み込むと言う方法もあり、ウィンドウ・アプリケーションとRのユーザー定義関数を融合することもできる。
*1RabbitMQ徹底解説 #RabbitMQ - Qiita
*2ただし、CRANに無いパッケージThe RabbitMQ client for Rを使うか、C/C++/Javaのライブラリを呼び出す必要がある。
0 コメント:
コメントを投稿