いろいろな種類のデータベースに対して、アプリケーションからは共通したプロトコルでアクセスできるようにするための規格としてODBCがあります。RODBCではRからODBCを使うことで、各種のデータベース上に格納されたテーブルをデータフレームに読み込む、データフレームをデータベースに格納するなどのことができます。
library(rodbc)
ODBCというとWindowsだけのもののように思えますが、データベースを抽象化して交換が可能にすること自体はどのOSでも有用なアプローチなので、LinuxやMacOS Xなどのunix系OSでも利用されることがあります。MacOS X では標準でiODBCというODBCドライバマネージャがインストールされるので、あとはiODBC用の各種データベース向けドライバをインストールすれば、RODBCが利用可能となります。
*MacOSX10.4.8現在:ODBCアドミニストレータという名称になっており、マネージャのインストールは不要。(しかし、ODBC Driver は何にも入っていませんので、ネットから見つけてくるしかありません)
MacOSX10.6(Snow Leopard) ではODBCアドミニストレータが標準で用意されていないため、Appleのサポートページからダウンロードしてくる必要があります。
デフォルトでは遅いのでチューンアップをしましょう。 GUIのMySQL Administratorで設定してもよいし、MySqlのディレクトリにあるmy.iniを直接変更しても大丈夫。
GUIの場合:"Startup Variables"を開いて、
1. InnoDB ParametersのFlush Log at: で、選択肢が3つありますが真ん中以外に変更します。下のほうがちょっと早いようです。正直、これが一番パフォーマンスに影響すると思います(thanks to なかまさん)。
2. General ParametersのKey Bufferをでっかくします(適当に)。少し早くなりました。
3. Advanced NetworkingのMax Packet Sizeをでっかくします。少し早くなりました。
4. AdvancedのJoin file sizeをでっかくします。ほんの少し早くなりました。
ローカルでのみつかう場合(TCP/IPではなく名前付きパイプの利用)
5. General ParametersのEnable Named Pipeのチェックをオンにします。
名前付きパイプを使う場合、MyODBCの"Server"は"."にします(ピリオドひとつ)。 MyODBC 5.0では名前付きパイプがなぜか上手くいきませんでした。
## 以下のデータで > dim(d) [1] 8640 22 channel <- odbcConnect("R3", uid="R", case="tolower") #sqlQuery(channel,"USE rdata") sqlSave(channel, d) sqlDrop(channel, "d") close(channel) } print(r<-system.time(f())) ## これを実行しました。 ## デフォルト [1] 2.66 0.70 375.40 NA NA ## 1-4まで変更 [1] 1.18 0.15 3.91 NA NA ## 1-4+5,6でNamed Pipeを使用 [1] 1.08 0.05 2.95 NA NA
大げさにではなく、100倍速くなりました。掲示板で文句言ってほんとにごめんなさい。 また、かかる時間は試行によって結構ばらつきます。平均すると、名前付きパイプを使ったほうが速いと思います。
チューンアップの方法はこれで全部ではないと思うので、気が付いたら書き加えていってください。
ちなみに
> print(system.time(write.table(d,"tmp.tsv"))) [1] 1.97 0.02 2.05 NA NA
でした。