SlideShare a Scribd company logo
1 of 42
Rで大規模解析   aa




          Tokyo.R #16
           和田 計也

サイバー系


            CyberAgent, Inc.
サイバー系


     アジェンダ

     1.      自己紹介
     2.      SAS 9.3が出た
     3.      Rをビルドしてみる(高速化できたらいいな)
     4.      大規模データを取得してみる
     5.      大規模データを扱ってみる
     6.      処理の高速化をしてみる
     7.      本日のハイライト




2011/08/27                                   1
サイバー系


     いまここ

     1.      自己紹介
     2.      SAS 9.3が出た
     3.      Rをビルドしてみる(高速化できたらいいな)
     4.      大規模データを取得してみる
     5.      大規模データを扱ってみる
     6.      処理の高速化をしてみる
     7.      本日のハイライト




2011/08/27                                   2
サイバー系


     1.自己紹介


  • 和田 計也(@wdkz)
         •   静岡県袋井市出身



  • サイバー系企業でデータマイニングエンジニア職
         •   創立記念日が3月18日
         •   社長の出身地が福井県鯖江市



  • 前職はバイオベンチャー
         •   バイオマーカ探索してた
         •   学生時代は枯草菌の研究




2011/08/27                           3
サイバー系


     いまここ

     1.      自己紹介
     2.      SAS 9.3が出た
     3.      Rをビルドしてみる(高速化できたらいいな)
     4.      大規模データを取得してみる
     5.      大規模データを扱ってみる
     6.      処理の高速化をしてみる
     7.      本日のハイライト




2011/08/27                                   4
サイバー系


     2 SAS 9.3(通称SAS美)が出た.SAS美


                    という記事が出たが、実際のところ変更点はそこじゃなさげ


         ↓主な変更点はこんな感じ




             •   HTML形式が標準の出力になった!
             •   新しいプロシージャー(Rでいうpackageみたいなの)がいくつかできた!
             •   IMLプロシージャー使ってR呼び出せる!
             •   GROOVYも使える!
             •   その他!

2011/08/27                                                       5
サイバー系


     いまここ

     1.      自己紹介
     2.      SAS 9.3が出た
     3.      Rをビルドしてみる(高速化できたらいいな)
     4.      大規模データを取得してみる
     5.      大規模データを扱ってみる
     6.      処理の高速化をしてみる
     7.      本日のハイライト




2011/08/27                                   6
サイバー系


     3.1 Rのビルド

     •       Windows 64bit OSでやってみる
              • 案外Windows でのビルド方法って
                ドキュメントないのね…




2011/08/27                                    7
サイバー系


     3.2 (参考)LinuxでRをコンパイル スコードからコンパイルする・Linux

     Linux(CentOS 5)用のRをソースコードからコンパイルする方法。
        X11とCairo関係をあらかじめインストールしておく。(しておかないとX関連が
        インストールできなくてエラー吐くよ。)
             yum groupinstall "X Window System"
             yum groupinstall "X Software Development"
             yum install cairo-devel
             wget http://cran.md.tsukuba.ac.jp/src/base/R-2/R-2.13.1.tar.gz
             tar –xvf R-2.13.1.tar.gz
             cd R-2.13.1
             ./configure
             make
             sudo make install


     X関連でエラーがとまらないときは仕方ないので
             ./configure --with-x=no
             make
             sudo make install




2011/08/27                                                                            8
サイバー系


      3.3 Rのソースコードをダウンロードースコードからコンパイルする・Win

  •     例えば http://cran.md.tsukuba.ac.jp/
  •     適当なフォルダ(C:¥tools¥R¥R-2.13.1.tar.gzとか)に置いて展開しておく




2011/08/27                                                    9
サイバー系


     3.4 ビルドツールをダウンロードコンパイルする・Win

     RtoolsをDL
     http://www.murdoch-sutherland.com/Rtools/




                                                 http://cran.md.tsukuba.ac.jp/




                     これ


2011/08/27                                                                           10
サイバー系


     3.5 ビルドツール(Rtools)をインストール



                                   64bit版のTcl/Tkを選択




      ★これ大事★ Rのソースを解凍した
      フォルダを指定。例えばC:¥tools¥R
      にR-2.13.1.tar.gzを置いて解凍した
      場合はC:¥tools¥R¥R-2.13.1となる。
      ここ間違うとビルド失敗します。


2011/08/27                                                11
サイバー系


     3.6 ビルド準備

     •    (たぶんRtoolsのインストール時に設定されてるはずだけど)
         Rtools¥binとRtools¥minGW64¥binをパスに追加する。
          例えばC:¥tools¥Rtools¥bin;C:¥tools¥Rtools¥MinGW64¥bin

     •       必要ライブラリの準備
             • 以下のlibpng, jpeg and libtiff sourcesをダウンロード
                http://www.libpng.org/
                http://www.ijg.org/
                ftp://ftp.remotesensing.org/pub/libtiff/

             • 解凍してR-2.13.1¥src¥gnuwin32¥bitmapに置く
                tar -zxf libpng-1.4.5.tar.gz
                mv libpng-1.4.5 libpng
                tar -zxf jpegsrc.v8c.tar.gz
                tar -zxf tiff-3.9.4.tar.gz
                mv tiff-3.9.4/libtiff .
                rm -rf tiff-3.9.4




2011/08/27                                                         12
サイバー系


     3.7 ビルド準備・続き

     •       ビルド設定ファイルの編集
             • R-2.13.1¥src¥gnuwin32¥MkRules.distを同一フォルダにコピペして
               MkRules.localと名付ける。
             • 以下、このMkRules.localを編集
               #JPEGDIR = jpeg-8c
               #PNGDIR = libpng
               #TIFFDIR = libtiff
              ↑3つのコメントアウトを外す

               WIN = 64
              ↑32を64に変更

               TMPDIR=C:¥DMZ
              ↑環境変数TMPDIRを作成して適当な場所(存在してればどこでも可)を設定


     •       ビルド時に、MkRules.local + MkRules.rulesがマージされてMkRulesという
             ファイルが自動的に生成され、それを基にビルドしていく。



2011/08/27                                                           13
サイバー系


     3.8 完成させる

     •       最後・コマンドプロンプトで
             cd C:¥tools¥R¥R-2.13.1¥src¥gnuwin32
             make all recommended
                                            Windowsの場合はここまで行ってね

     •       バイナリ
             C:¥tools¥R¥R-2.13.1¥binフォルダ内によく見慣れた一式ができる。




2011/08/27                                                            14
サイバー系


     3.9 バイトコンパイルする(とRが速くなるという噂)

     •       MkRules.localを編集(以下の2行を追加)
             •   R_COMPILE_PKGS=1
             •   R_COMPILER_SUPPRESS_ALL=1


     •       コマンドプロンプトで
             • make bytecode

     •       ちなみに、普通のRでも関数単位でバイトコンパイルできます。
              library(compiler)
              f <- cmpfun(<関数名>)




2011/08/27                                       15
サイバー系


     3.10 やったね!

     2011年10月登場予定のR次期バージョンは、コンパイル済でやってきます!




2011/08/27                                   16
サイバー系


     3.11 BLASライブラリとしてGotoBLASを使う(とRが速くなるという噂)える

     http://prs.ism.ac.jp/~nakama/SurviveGotoBLAS2/      GotoBLASはメンテ・開発が終了してるので
                                                         ここから、生きてるGotoBLASをダウンロード




                                    自分のマシンのCPUに
                                    合ったものをダウンロード




                                                      binフォルダ内(64bitならx64内)の
                                                      Rblas.dllファイルを置き換える


2011/08/27                                                                          17
サイバー系


     3.12 やる夫の憂鬱

         ____
        /      \
       / ⌒     ⌒\
     /   (●) (●) \    ホントはMKLを使うようにビルドしたかったお
     |    (__人__) |   誰かやりかたわかったら教えてお
     /    ∩ノ ⊃ /
     ( \ / _ノ | |
     .\ “ /__| |
       \ /___ /




2011/08/27                                         18
サイバー系


     3.13 RevolutionR Community Edition

     •       無料で利用可能です。
             • http://www.revolutionanalytics.com/products/revolution-r.php
             • 普通のRと同じように使えます。(アイコンが違うぐらい)




     •       BLASライブラリ,LAPACKライブラリがMKLのです!!

2011/08/27                                                                        19
サイバー系


     いまここ

     1.      自己紹介
     2.      SAS 9.3が出た
     3.      Rをビルドしてみる(高速化できたらいいな)
     4.      大規模データを取得してみる
     5.      大規模データを扱ってみる
     6.      処理の高速化をしてみる
     7.      本日のハイライト




2011/08/27                               20
サイバー系


        4.1 Hadoopクラスタの概念図




    •        データストアとしてHadoopを利用していることが多
             いかと思います。
    •        RHIPE使うとか
              • 第14回R勉強会@東京(Tokyo.R#14)で『R
                が黄色い象に出会った
             • http://ml.stat.purdue.edu/rhipe/
2011/08/27                                            21
サイバー系


     4.2 Hiveいいね!

     •       Map-Reduce書いてもいいけど、書きたくない
     •       HiveQLならSQL likeな記述でデータ扱える
             (勝手にMap-Reduceに変換してくれる)
             •   https://cwiki.apache.org/confluence/display/Hive/Home
     •       サイバーエージェントさんのようにClouderaのパッケージを導入しているな
             らHiveも使えるね
             •   http://www.slideshare.net/toutouzone/hadoop-conferencejapan2011




2011/08/27                                                                             22
サイバー系


     4.3 RでhiveQLが使えるといいなぁ


             •       理想はRODBC

             library(RODBC)
             conn <- odbcConnect(“testdb”, “tokyor”, “yokkuns”) #繋いで
             x <- sqlQuery(conn, “select * from ameba_tbl”)     #取得して
             odbcClose(conn)                                    #切断する




                 R
                          rJava         Java
                                                   JDBC
                                      (自前クラス)                           Hive




                      こんな感じのRHive欲しい                                           Hadoop




2011/08/27                                                                                  23
サイバー系


     4.4 rJavaの使い方1(基本編)

     #あらかじめJavaはインストールしておく

     install.packages(rjava) #rJavaのインストール

     library(rJava)

     .jinit() #JVMの起動                                               クラス名                                  コンストラクタの引数

     #インスタンス化                                                       .jnew(“java/lang/String”, “Hello World!”)
     # String s = new String(“Hello World!”);
     s <- .jnew(“java/lang/String”, “Hello World!”)

                                                            インスタンス名                          メソッド名(括弧なし)
     #メソッド
     #s.length()
     .jcall(s, “I”, “length”)                                       .jcall(s, ”I”, “length”)
     [1] 12
                                                                              戻り値の型
     #文字列は注意                                          I ; integer     D ; double (numeric)       J ; long           F ; float
     print(s)                                         V ; void        Z ; boolean                C ; char (integer) B ; byte (raw)

     [1] "Java-Object: Hello World“

     #こうやって取り出す
     .jstrVal(s)
     [1] "Hello World"

2011/08/27                                                                                                                           24
サイバー系


     4.4 rJavaの使い方2(ちょっとマニアック編)

     #クラスパス指定&起動オプション付きでJVMの起動
     .jinit(classpath=c(“C:¥¥tokyor¥¥Tokyor.jar”), parameters=c(”-Xms4g”, “-Xmx4g”))

     #クラス変数, クラスメソッド
     #Math.pi
     with(J("java.lang.Math"), pi)
     #System.gc()
     with(J("java.lang.System"), gc())

     #インスタンス化                                実際はパッケージ名から書いてね
     # TokyoR tokyoR = new TokyoR();                                                    *ちなみに配列の場合は
     tokyo.r <- .jnew(“Tokyo.R”)                                                        [+型
                                            数値はすべてdouble型で渡されるので                        [I  intの配列
                                            Int型を明示して渡す                                 [S Stringの配列
     #メソッド
     #tokyoR.setNumber(16)                                                              [[I intの2次元配列
     .jcall(tokyor “V”, “setNumber”, as.integer(16))
                                                                                        Javaの配列をRで使うには
                                                                                        .jevalArray(x)で変換が必要
     #tokyoR.getNumber()
     .jcall(tokyor, “I”, “getNumber”)
                                         L + クラス名 + ;                                   Rの配列をJavaに渡すには
     [1] 16
                                         とする                                            .jarray(1:10)
     #戻り値がクラスの場合
     .jcall(tokyor “Ljava/util/ArrayList;”, “getPersonList”)                           これは何故かint型になる


2011/08/27                                                                                                     25
サイバー系


     4.5 自作クラスを適当に作成
                                                                                               HiveConnector
     •       こんな感じのJavaクラスを作って→
                                                                                 - conn : Connection
     •       Rで関数定義                                                              + init : void
                                                                                 + connect2Hive ( server: String): void
     hiveConnect <- function(server, port=10000){                                + hiveQuery(sql: String) : ArrayList<int[]>
       library(rJava)                                                            + closeConn: void
                                                                                 + getHeader : int[]
       .jinit()
       connStr <- .jnew(“java/lang/String”, (paste(“jdbc:hive://”, server, “:”, port, “/default”, sep=“”)))
       hiveConn <- .jnew("jp/ameba/rhive/HiveConnector")
       .jcall(hiveConn, , "connect2Hive", connStr)
       return(hiveConn)
     }

     hiveqlQuery <- function(hiveConn, query){
       header <- .jcall(hiveConn, “[S”, “getHeader”)
       res.list <- as.list(.jcall(hiveConn, “Ljava/util/ArrayList;","hiveQuery",.jnew("java/lang/String", query)))
       res.matrix<- matrix(unlist(lapply(res.list, function(x){strsplit(.jevalArray(x),",")}))
                                 , ncol=length(header), byrow=TRUE)
       return(res.matrix)                                                                          注!!実際にはこのまま
     }                                                                                             使うとメモリが足りなくて
                                                                                                   爆死します。
     hiveClose <- function(hiveConn){     .jcall(hiveConn, "V", "closeHive") }




2011/08/27                                                                                                                         26
サイバー系


     4.6 HiveのJDBCは0.7.1じゃなくて開発版の0.8.0を使う

         v 0.7.1(現行版)                v 0.8.0-SNAPSHOT(開発版)
            <<interface>>                     <<interface>>
             ResultSet                         ResultSet




     HiveBaseResultSet                   HiveBaseResultSet
                {abstract}                          {abstract}




  +setFetchSize(rows : int) : void    +setFetchSize(rows : int) : void




         HiveQueryResultSet               HiveQueryResultSet


                                       -fetchSize : int

                                      +setFetchSize(rows : int) : void




     •       現行版のhive-jdbc-0.7.1.jarはfetchの指定ができないし、そもそもしてない
             ので我慢ならんくらい遅い。特にHiveは大きなデータを取得することが多い
             ためfetchが使える0.8.0を使う(か、0.7.1を修正して使う。)
2011/08/27                                                                   27
サイバー系


     4.7 Rhiveを使ってみる

     •       hive-jdbc.jarを使うのに必要なjarファイル群*にクラスパスを設定して
     •       Thrift Serverをサーバ側で起動しておいて




     •       ローカルマシンのRから使う
              source(“Rhive.R”)
              hiveConn <- hiveConnect(“サーバ名かIP アドレス”)
              ameba_user <- hiveQuery(hiveConn, “select * from ameba_user”)
              hiveClose(hiveConn)

          必要なのjar

         *common-lang3-*.jar, commons-logging-1.*.jar, hadoop-core-0.20*.jar, hive-cli-0.7*.jar, hive-common-0.7*.jar,
          hive-contrib-0.7*.jar, hive-exec-0.7*.jar, hive-hwi-0.7*.jar, hive-jdbc-0.8*.jar, hive-metastore-0.7*.jar, hive-service-0.7*.jar,
          log4j-1.2*.jar, slf4j-api-1.6*.jar, slf4j-log4j12-1.6*.jar, thrift-0.5*.jar, thrift-fb303-0.5*.jar, RHive.jar

2011/08/27                                                                                                                                    28
サイバー系


     4.8 rJavaは困った子(ちょっと注意)

     •       メモリを解放してくれない
             •   rm(list=ls()); gc()しても
             •   Javaで明示的にnull入れるメソッド書いて、それをRから呼び出してJavaのSystem.gc()呼び出しても
                 メモリ使用量が減らんのですよ



     •  メモリ解放ソフトウェアを使うしかないかなぁ
        →せっかくならmicrosoft社製のがいいかな
     1. Windows Server 2003 Resource Kit Toolsをダウンロード
             http://www.microsoft.com/downloads/details.aspx?familyid=9d467a69-57ff-4ae7-96ee-b18c4790cffd&displaylang=en

     2. exeファイル(インストーラ)を解凍する
             1. 7Zipとか使う http://sevenzip.sourceforge.jp/
             2. 「rktools.exeを解凍」→「rktools.msiを解凍」→empty.exeをコピー
             3. C:¥WINDOWS¥system32 にコピー&ペースト (64bit OSでもここ)
                                                            システム命令をRから呼び出しているだけ
     3. Rではこう使う
             system(“empty Rgui.exe”)
2011/08/27                                                                                                                  29
サイバー系


     いまここ

     1.      自己紹介
     2.      SAS 9.3が出た
     3.      Rをビルドしてみる(高速化できたらいいな)
     4.      大規模データを取得してみる
     5.      大規模データを扱ってみる
     6.      処理の高速化をしてみる
     7.      本日のハイライト




2011/08/27                               30
サイバー系


     5.1 Rで大規模データを扱いたい

     •       Rの弱点
              • データは基本的にオンメモリ
     •       大規模データ管理パッケージ
              • bigmemory
                    • 良い点・・・複数プロセスから同時にアクセスできる。つまりクラスタ処理対応可能。通常の行列の
                      よう    にデータハンドリングできる。x[1:10,]とか
                    • 悪い点・・・行列のみ。データフレームだめ。基本的に数値型だけ
             • ff
                    • 良い点・・・行列、データフレーム両方いける。因子型もいける。
                    • 悪い点・・・クラスタ処理できない。(試してないけどたぶんforeachとかで並列処理はできそう。)
                      データハンドリングの関数が専用


     •       とりあえず、bigmemoryパッケージを使うわ
     •       第10回TokyoWebMining勉強会の資料が詳しい
     http://www.slideshare.net/sfchaos/rbigmemory-tokyowebmining10




2011/08/27                                                                31
サイバー系


     5.2 Rのbigmemoryパッケージ

     install.packages(bigmemory);
     library(bigmemory)

     #Rの行列からbigmemoryへ #あまり使わない
                                                             backingfileを指定しないと、実体がディスク上ではなく
     ameba <- as.big.matrix(matrix(1:40, 10,4))              Shared memory上に作成されてしまうので注意

     #bigmemory行列をあらかじめ作っておいて
     ameba <- big.matrix(10000000, 4, type=“integer”, init=-1, backingfile=“ameba.bin”)
     #カラム名をつける
     options(bigmemory.allow.dimnames=TRUE)                                               1000万行 x 4列の行列をinteger
     colnames(ameba) <- c(“ameba_id”, “create_year”, “create_month”, “create_day”)        型で初期値-1で作るわ。データ
     #追加していく                                                                              の実体はカレントフォルダに
                                                                                          「ameba.bin」でヨロシク!って意
     ameba[1:10,] <- matrix(1:40,10,4)                                                    味です。


     #csvファイルからbigmemoryへ #これが一番よく使う
     ameba <- read.big.matrix(“ameba.csv”, header=TRUE, sep=“,”, backingfile=“ameba.bin”,
         descriptorfile=“ameba.desc”)



              descriptorfileは省略可能。
              その場合はbackingfile名+.descとなる

2011/08/27                                                                                                         32
サイバー系


     5.3 Rのbigmemoryパッケージ 2
                                                                            データの実態はこのファイル
     #bigmemoryオブジェクトの永続化
     ameba <- read.big.matrix(“ameba.csv”, header=TRUE, sep=“,”, backingfile=“ameba.bin”,
         descriptorfile=“ameba.desc”)

                                   でも次回、このデータを使う場合はこっちを明示
     #Rを再起動後に読み込み
     ameba <- attach.big.matrix(“ameba.desc”)

     #行列サイズ確認
     dim(ameba)

     #行列要素にアクセス
     ameba[,] #全データ出力だけどやってはダメだよ
     ameba[1:10, ] #先頭10行

     #集計もできる
     library(bigtabulate)
     summary(ameba)
     bigtable(ameba, “create_year”) #table(ameba[,2])でも同じ結果が得られるけど速度がぜんぜん違う

     #glmもできるしk-meansもできる
     library(biganalytics)

2011/08/27                                                                                      33
サイバー系


     5.4 Rhiveから直接bigmemoryへ

     •       RHiveで取得するデータって普通はgigabyte越えだから、直接bigmemory化
             されるといいね!!でも問題がちらほら…
              1. メモリの問題




              R上の変数                 Java
                          rJava             R上の変数                 Java
              (オンメモリ)             (オンメモリ)               rJava


                                                        CSVファイル


              bigmemory
                                            bigmemory
              (ディスク上)
                                            (ディスク上)




             2.    型の問題
                  bigmemoryだと数値  Java側で文字列を数値に変換(変換表はHashMap)
                                  RでそのHashMapを受けとるとかの工夫が必要

2011/08/27                                                                   34
サイバー系


     5.5 ちなみにRのhashパッケージが結構便利

     install.packages(hash)                    Javaなんかでよ
                                               く使うHashみた
     library(hash)                             いなのをがRでも
                                               使えるよって話


     h <- hash()
     .set(h, “Tokyo.R16”, “DeNA”)
     .set(h, a=1, b=2, c=3) #一括でもセットできる。

     h <- hash(a=1, b=2, c=3) #生成時に一括セットもできる
     values(h, “Tokyo.R16”)
     [1] “DeNA”

     clear(h) #これしないとメモリ解放しないらしい
     rm(h) #だから↑rmする前にclearしておくこと


2011/08/27                                                     35
サイバー系


     いまここ

     1.      自己紹介
     2.      SAS美の近況
     3.      Rをビルドしてみる(高速化できたらいいな)
     4.      大規模データを取得してみる
     5.      大規模データを扱ってみる
     6.      処理の高速化をしてみる
     7.      本日のハイライト




2011/08/27                               36
サイバー系


     6.1 処理の高速化
     •       並列処理して高速化してみる
              •   Rは基本シングルコアでしか計算しない。
              •   とはいえ、大規模データ扱うなら(しかもコアが余ってるなら)並列処理したいよね
              •   めちゃくちゃショボイ例で申し訳ない。
         install.packages("foreach")
         install.packages(“doSMP”)     #Linux, MacOSXはdoMCでもいいけど、WindowsはdoMCが使えないからdoSMPを使う

         getDoParWorkers() #現状の使用コア設定数を確認
         #[1] 1            #このままだとコア1つしか使わない

         w <- startWorkers(4) #並列処理する数を設定
         registerDoSMP(w) #これで並列計算用のプロセス(windowsだったらRterm.exe)が多数起動する。

         getDoParWorkers()     #使用コア設定数が変更されたか確認
         #[1] 4                                 %dopar%を%do%にすると並列計算しないよ

         foreach(i = 1:N, .combine = “c”) %dopar% { #for文のかわりにforeach文を使う
           sum(rnorm(1e+6))
         }                                  cだと戻り値がベクトルになる。ここを例えばcbindにすると横に長いmatrixで戻ってくる

         stopWorkers(w) #最後にWorkerを消し去る
         #↑これしないとR(windowsだったらRgui.exe)を終了してもプロセス(windowsだったらRterm.exe)が多数残ってしまう。
         #これせずにRを終了させて残ってるRterm.exeプロセスをkillしても次回にRを起動してからstartWorkers()呼んだ時に
          警告メッセージ:
         1: In startWorkers(12) : there is an existing doSMP session using doSMP1

         #こんなんでる。その時は↓みたくしてセッションを切るとOK
         rmSessions(qnames="doSMP1")


                                                                                             もう仕分け無い
2011/08/27                                                                                             37
サイバー系


     6.2 Revolution R Enterprise Editionがなかなかいいかも


     http://www.revolutionanalytics.com/why-revolution-r/which-r-is-right-for-me.php




                                              これ、RevoScaleRというパッケージ
                                              なんだが、なかなか良さそう。
                                              1. データはファイルシステムに置く
                                              2. ベクトル、行列、データフレーム使える
                                                 (リストはダメっぽい)
                                              3. 数値型、因子型、文字列扱える
                                              4. 計算処理は自動的に並列処理してく
                                                 れる
                                              5. もうじきクラスタ計算に対応



2011/08/27                                                                             38
サイバー系


     6.3 Revolution R Enterprise Edition

     •       $1,000/year/user




     •       HPCクラスタだといくらかわかんない




2011/08/27                                     39
サイバー系


     いまここ

     1.      自己紹介
     2.      SAS美の近況
     3.      Rをビルドしてみる(高速化できたらいいな)
     4.      大規模データを取得してみる
     5.      大規模データを扱ってみる
     6.      処理の高速化をしてみる
     7.      本日のハイライト




2011/08/27                               40
サイバー系


     7. 本日のハイライト

     1.       自己紹介
             @wdkzはサイバー系
     2.       SAS 9.3出たよ
             SAS 9.3出たけど…
     3.        Rをビルドしてみる
             Windowsマシンは窓から投げ捨てたくなる
     4.       大規模データを取得してみる
             RでHiveQLを使って直接データ取得する
     5.       大規模データを扱ってみる
             bigmemoryつかう。HiveQL->bigmemoryとか。
     6.       処理の高速化をしてみる
             foreachとdoSMPで並列化できる。 RevoScaleRもいいね!




2011/08/27                                               41

More Related Content

What's hot

巨大な表を高速に扱うData.table について
巨大な表を高速に扱うData.table について巨大な表を高速に扱うData.table について
巨大な表を高速に扱うData.table について
Haruka Ozaki
 
Rユーザのためのspark入門
Rユーザのためのspark入門Rユーザのためのspark入門
Rユーザのためのspark入門
Shintaro Fukushima
 
R を起動するその前に
R を起動するその前にR を起動するその前に
R を起動するその前に
Kosei ABE
 
20140531 JPUGしくみ+アプリケーション分科会 勉強会資料
20140531 JPUGしくみ+アプリケーション分科会 勉強会資料20140531 JPUGしくみ+アプリケーション分科会 勉強会資料
20140531 JPUGしくみ+アプリケーション分科会 勉強会資料
kasaharatt
 
Postgre sql9.3 newlockmode_and_etc
Postgre sql9.3 newlockmode_and_etcPostgre sql9.3 newlockmode_and_etc
Postgre sql9.3 newlockmode_and_etc
kasaharatt
 
統計解析言語Rにおける大規模データ管理のためのboost.interprocessの活用
統計解析言語Rにおける大規模データ管理のためのboost.interprocessの活用統計解析言語Rにおける大規模データ管理のためのboost.interprocessの活用
統計解析言語Rにおける大規模データ管理のためのboost.interprocessの活用
Shintaro Fukushima
 
仮想記憶入門 BSD-4.3を例題に
仮想記憶入門 BSD-4.3を例題に仮想記憶入門 BSD-4.3を例題に
仮想記憶入門 BSD-4.3を例題に
magoroku Yamamoto
 
【Zabbix2.0】snmpttによるトラップメッセージの編集 #Zabbix #自宅ラック勉強会
【Zabbix2.0】snmpttによるトラップメッセージの編集 #Zabbix #自宅ラック勉強会【Zabbix2.0】snmpttによるトラップメッセージの編集 #Zabbix #自宅ラック勉強会
【Zabbix2.0】snmpttによるトラップメッセージの編集 #Zabbix #自宅ラック勉強会
真乙 九龍
 
OSC沖縄2014_JPUG資料
OSC沖縄2014_JPUG資料OSC沖縄2014_JPUG資料
OSC沖縄2014_JPUG資料
kasaharatt
 

What's hot (20)

巨大な表を高速に扱うData.table について
巨大な表を高速に扱うData.table について巨大な表を高速に扱うData.table について
巨大な表を高速に扱うData.table について
 
Rの高速化
Rの高速化Rの高速化
Rの高速化
 
Rユーザのためのspark入門
Rユーザのためのspark入門Rユーザのためのspark入門
Rユーザのためのspark入門
 
Mysql casial01
Mysql casial01Mysql casial01
Mysql casial01
 
R を起動するその前に
R を起動するその前にR を起動するその前に
R を起動するその前に
 
片手間MySQLチューニング戦略
片手間MySQLチューニング戦略片手間MySQLチューニング戦略
片手間MySQLチューニング戦略
 
V6 unix in okinawa
V6 unix in okinawaV6 unix in okinawa
V6 unix in okinawa
 
Rでreproducible research
Rでreproducible researchRでreproducible research
Rでreproducible research
 
Kernel fcache-bug
Kernel fcache-bugKernel fcache-bug
Kernel fcache-bug
 
20140531 JPUGしくみ+アプリケーション分科会 勉強会資料
20140531 JPUGしくみ+アプリケーション分科会 勉強会資料20140531 JPUGしくみ+アプリケーション分科会 勉強会資料
20140531 JPUGしくみ+アプリケーション分科会 勉強会資料
 
Postgre sql9.3 newlockmode_and_etc
Postgre sql9.3 newlockmode_and_etcPostgre sql9.3 newlockmode_and_etc
Postgre sql9.3 newlockmode_and_etc
 
MySQLを割と一人で300台管理する技術
MySQLを割と一人で300台管理する技術MySQLを割と一人で300台管理する技術
MySQLを割と一人で300台管理する技術
 
統計解析言語Rにおける大規模データ管理のためのboost.interprocessの活用
統計解析言語Rにおける大規模データ管理のためのboost.interprocessの活用統計解析言語Rにおける大規模データ管理のためのboost.interprocessの活用
統計解析言語Rにおける大規模データ管理のためのboost.interprocessの活用
 
Zabbix2.0.3の新機能と変更点
Zabbix2.0.3の新機能と変更点Zabbix2.0.3の新機能と変更点
Zabbix2.0.3の新機能と変更点
 
仮想記憶入門 BSD-4.3を例題に
仮想記憶入門 BSD-4.3を例題に仮想記憶入門 BSD-4.3を例題に
仮想記憶入門 BSD-4.3を例題に
 
【Zabbix2.0】snmpttによるトラップメッセージの編集 #Zabbix #自宅ラック勉強会
【Zabbix2.0】snmpttによるトラップメッセージの編集 #Zabbix #自宅ラック勉強会【Zabbix2.0】snmpttによるトラップメッセージの編集 #Zabbix #自宅ラック勉強会
【Zabbix2.0】snmpttによるトラップメッセージの編集 #Zabbix #自宅ラック勉強会
 
ヤフー社内でやってるMySQLチューニングセミナー大公開
ヤフー社内でやってるMySQLチューニングセミナー大公開ヤフー社内でやってるMySQLチューニングセミナー大公開
ヤフー社内でやってるMySQLチューニングセミナー大公開
 
イルカさんチームからゾウさんチームに教えたいMySQLレプリケーション
イルカさんチームからゾウさんチームに教えたいMySQLレプリケーションイルカさんチームからゾウさんチームに教えたいMySQLレプリケーション
イルカさんチームからゾウさんチームに教えたいMySQLレプリケーション
 
PythonでテキストをJSONにした話(PyCon mini sapporo 2015)
PythonでテキストをJSONにした話(PyCon mini sapporo 2015)PythonでテキストをJSONにした話(PyCon mini sapporo 2015)
PythonでテキストをJSONにした話(PyCon mini sapporo 2015)
 
OSC沖縄2014_JPUG資料
OSC沖縄2014_JPUG資料OSC沖縄2014_JPUG資料
OSC沖縄2014_JPUG資料
 

Similar to Tokyo.R#16 wdkz

Rubyによるお手軽分散処理
Rubyによるお手軽分散処理Rubyによるお手軽分散処理
Rubyによるお手軽分散処理
maebashi
 
自分色のLinuxホームサーバーを作ってみよう
自分色のLinuxホームサーバーを作ってみよう自分色のLinuxホームサーバーを作ってみよう
自分色のLinuxホームサーバーを作ってみよう
Masahiko Hashimoto
 
Nseg20120825
Nseg20120825Nseg20120825
Nseg20120825
hiro345
 
Ruby on Rails3 Tutorial Chapter3
Ruby on Rails3 Tutorial Chapter3Ruby on Rails3 Tutorial Chapter3
Ruby on Rails3 Tutorial Chapter3
Sea Mountain
 
Linux/DB Tuning (DevSumi2010, Japanese)
Linux/DB Tuning (DevSumi2010, Japanese)Linux/DB Tuning (DevSumi2010, Japanese)
Linux/DB Tuning (DevSumi2010, Japanese)
Yoshinori Matsunobu
 
Djangoとweb2pyをapacheに組込む
Djangoとweb2pyをapacheに組込むDjangoとweb2pyをapacheに組込む
Djangoとweb2pyをapacheに組込む
2bo 2bo
 

Similar to Tokyo.R#16 wdkz (20)

【学習メモ#1st】12ステップで作る組込みOS自作入門
【学習メモ#1st】12ステップで作る組込みOS自作入門【学習メモ#1st】12ステップで作る組込みOS自作入門
【学習メモ#1st】12ステップで作る組込みOS自作入門
 
ロボットシステムのつくりかた 〜Robot Operating Systemというアプローチ〜
ロボットシステムのつくりかた 〜Robot Operating Systemというアプローチ〜ロボットシステムのつくりかた 〜Robot Operating Systemというアプローチ〜
ロボットシステムのつくりかた 〜Robot Operating Systemというアプローチ〜
 
Rubyによるお手軽分散処理
Rubyによるお手軽分散処理Rubyによるお手軽分散処理
Rubyによるお手軽分散処理
 
シラサギハンズオン 1015 1016
シラサギハンズオン 1015 1016シラサギハンズオン 1015 1016
シラサギハンズオン 1015 1016
 
ゆるふわLinux-HA 〜PostgreSQL編〜
ゆるふわLinux-HA 〜PostgreSQL編〜ゆるふわLinux-HA 〜PostgreSQL編〜
ゆるふわLinux-HA 〜PostgreSQL編〜
 
Rancher と GitLab を使う3つの理由
Rancher と GitLab を使う3つの理由Rancher と GitLab を使う3つの理由
Rancher と GitLab を使う3つの理由
 
osoljp 2011.08
osoljp 2011.08osoljp 2011.08
osoljp 2011.08
 
自分色のLinuxホームサーバーを作ってみよう
自分色のLinuxホームサーバーを作ってみよう自分色のLinuxホームサーバーを作ってみよう
自分色のLinuxホームサーバーを作ってみよう
 
Nseg20120825
Nseg20120825Nseg20120825
Nseg20120825
 
Dockerの仕組みとIIJ社内での利用例
Dockerの仕組みとIIJ社内での利用例Dockerの仕組みとIIJ社内での利用例
Dockerの仕組みとIIJ社内での利用例
 
NetBSDのクロスビルドのしくみとインストール済みLive Imageの作成
NetBSDのクロスビルドのしくみとインストール済みLive Imageの作成NetBSDのクロスビルドのしくみとインストール済みLive Imageの作成
NetBSDのクロスビルドのしくみとインストール済みLive Imageの作成
 
Cell/B.E. プログラミング事始め
Cell/B.E. プログラミング事始めCell/B.E. プログラミング事始め
Cell/B.E. プログラミング事始め
 
S3 を単純ストレージとして 利用する手段の比較
S3 を単純ストレージとして 利用する手段の比較S3 を単純ストレージとして 利用する手段の比較
S3 を単純ストレージとして 利用する手段の比較
 
Ruby on Rails3 Tutorial Chapter3
Ruby on Rails3 Tutorial Chapter3Ruby on Rails3 Tutorial Chapter3
Ruby on Rails3 Tutorial Chapter3
 
OSSで実現するハイブリッドクラウド4ノードクラスタ ~Pacemakerのチケット機能で災害対策~
OSSで実現するハイブリッドクラウド4ノードクラスタ ~Pacemakerのチケット機能で災害対策~OSSで実現するハイブリッドクラウド4ノードクラスタ ~Pacemakerのチケット機能で災害対策~
OSSで実現するハイブリッドクラウド4ノードクラスタ ~Pacemakerのチケット機能で災害対策~
 
いまさら聞けないRake入門
いまさら聞けないRake入門いまさら聞けないRake入門
いまさら聞けないRake入門
 
Start-padrino
Start-padrinoStart-padrino
Start-padrino
 
Linux/DB Tuning (DevSumi2010, Japanese)
Linux/DB Tuning (DevSumi2010, Japanese)Linux/DB Tuning (DevSumi2010, Japanese)
Linux/DB Tuning (DevSumi2010, Japanese)
 
Djangoとweb2pyをapacheに組込む
Djangoとweb2pyをapacheに組込むDjangoとweb2pyをapacheに組込む
Djangoとweb2pyをapacheに組込む
 
20190926_Try_RHEL8_NVMEoF_Beta
20190926_Try_RHEL8_NVMEoF_Beta20190926_Try_RHEL8_NVMEoF_Beta
20190926_Try_RHEL8_NVMEoF_Beta
 

More from Kazuya Wada (11)

オンラインTVサービスの分析事例
オンラインTVサービスの分析事例オンラインTVサービスの分析事例
オンラインTVサービスの分析事例
 
DeployR使ってみた話
DeployR使ってみた話DeployR使ってみた話
DeployR使ってみた話
 
道玄坂Lt#2 wdkz
道玄坂Lt#2 wdkz道玄坂Lt#2 wdkz
道玄坂Lt#2 wdkz
 
ハイレゾの話
ハイレゾの話ハイレゾの話
ハイレゾの話
 
Shiny-Serverあれこれ
Shiny-ServerあれこれShiny-Serverあれこれ
Shiny-Serverあれこれ
 
データサイエンティストカジュアルトーク by wdkz
データサイエンティストカジュアルトーク by wdkzデータサイエンティストカジュアルトーク by wdkz
データサイエンティストカジュアルトーク by wdkz
 
R-3.0.0でGLM
R-3.0.0でGLMR-3.0.0でGLM
R-3.0.0でGLM
 
はじめてのShiny
はじめてのShinyはじめてのShiny
はじめてのShiny
 
JuliaでGLM
JuliaでGLMJuliaでGLM
JuliaでGLM
 
Rで触れる日本経済~RでVAR編~
Rで触れる日本経済~RでVAR編~Rで触れる日本経済~RでVAR編~
Rで触れる日本経済~RでVAR編~
 
Rでウォーリを探してみた
Rでウォーリを探してみたRでウォーリを探してみた
Rでウォーリを探してみた
 

Recently uploaded

研究紹介スライド: オフライン強化学習に基づくロボティックスワームの制御器の設計
研究紹介スライド: オフライン強化学習に基づくロボティックスワームの制御器の設計研究紹介スライド: オフライン強化学習に基づくロボティックスワームの制御器の設計
研究紹介スライド: オフライン強化学習に基づくロボティックスワームの制御器の設計
atsushi061452
 

Recently uploaded (14)

Amazon Cognitoで実装するパスキー (Security-JAWS【第33回】 勉強会)
Amazon Cognitoで実装するパスキー (Security-JAWS【第33回】 勉強会)Amazon Cognitoで実装するパスキー (Security-JAWS【第33回】 勉強会)
Amazon Cognitoで実装するパスキー (Security-JAWS【第33回】 勉強会)
 
20240523_IoTLT_vol111_kitazaki_v1___.pdf
20240523_IoTLT_vol111_kitazaki_v1___.pdf20240523_IoTLT_vol111_kitazaki_v1___.pdf
20240523_IoTLT_vol111_kitazaki_v1___.pdf
 
研究紹介スライド: オフライン強化学習に基づくロボティックスワームの制御器の設計
研究紹介スライド: オフライン強化学習に基づくロボティックスワームの制御器の設計研究紹介スライド: オフライン強化学習に基づくロボティックスワームの制御器の設計
研究紹介スライド: オフライン強化学習に基づくロボティックスワームの制御器の設計
 
クラウド時代におけるSREとUPWARDの取組ーUPWARD株式会社 CTO門畑
クラウド時代におけるSREとUPWARDの取組ーUPWARD株式会社 CTO門畑クラウド時代におけるSREとUPWARDの取組ーUPWARD株式会社 CTO門畑
クラウド時代におけるSREとUPWARDの取組ーUPWARD株式会社 CTO門畑
 
ロボットマニピュレーションの作業・動作計画 / rosjp_planning_for_robotic_manipulation_20240521
ロボットマニピュレーションの作業・動作計画 / rosjp_planning_for_robotic_manipulation_20240521ロボットマニピュレーションの作業・動作計画 / rosjp_planning_for_robotic_manipulation_20240521
ロボットマニピュレーションの作業・動作計画 / rosjp_planning_for_robotic_manipulation_20240521
 
論文紹介:ViTPose: Simple Vision Transformer Baselines for Human Pose Estimation
論文紹介:ViTPose: Simple Vision Transformer Baselines for Human Pose Estimation論文紹介:ViTPose: Simple Vision Transformer Baselines for Human Pose Estimation
論文紹介:ViTPose: Simple Vision Transformer Baselines for Human Pose Estimation
 
Hyperledger Fabricコミュニティ活動体験& Hyperledger Fabric最新状況ご紹介
Hyperledger Fabricコミュニティ活動体験& Hyperledger Fabric最新状況ご紹介Hyperledger Fabricコミュニティ活動体験& Hyperledger Fabric最新状況ご紹介
Hyperledger Fabricコミュニティ活動体験& Hyperledger Fabric最新状況ご紹介
 
部内勉強会(IT用語ざっくり学習) 実施日:2024年5月17日(金) 対象者:営業部社員
部内勉強会(IT用語ざっくり学習) 実施日:2024年5月17日(金) 対象者:営業部社員部内勉強会(IT用語ざっくり学習) 実施日:2024年5月17日(金) 対象者:営業部社員
部内勉強会(IT用語ざっくり学習) 実施日:2024年5月17日(金) 対象者:営業部社員
 
5/22 第23回 Customer系エンジニア座談会のスライド 公開用 西口瑛一
5/22 第23回 Customer系エンジニア座談会のスライド 公開用 西口瑛一5/22 第23回 Customer系エンジニア座談会のスライド 公開用 西口瑛一
5/22 第23回 Customer系エンジニア座談会のスライド 公開用 西口瑛一
 
Intranet Development v1.0 (TSG LIVE! 12 LT )
Intranet Development v1.0 (TSG LIVE! 12 LT )Intranet Development v1.0 (TSG LIVE! 12 LT )
Intranet Development v1.0 (TSG LIVE! 12 LT )
 
情報を表現するときのポイント
情報を表現するときのポイント情報を表現するときのポイント
情報を表現するときのポイント
 
MPAなWebフレームワーク、Astroの紹介 (その1) 2024/05/17の勉強会で発表されたものです。
MPAなWebフレームワーク、Astroの紹介 (その1) 2024/05/17の勉強会で発表されたものです。MPAなWebフレームワーク、Astroの紹介 (その1) 2024/05/17の勉強会で発表されたものです。
MPAなWebフレームワーク、Astroの紹介 (その1) 2024/05/17の勉強会で発表されたものです。
 
論文紹介:Deep Occlusion-Aware Instance Segmentation With Overlapping BiLayers
論文紹介:Deep Occlusion-Aware Instance Segmentation With Overlapping BiLayers論文紹介:Deep Occlusion-Aware Instance Segmentation With Overlapping BiLayers
論文紹介:Deep Occlusion-Aware Instance Segmentation With Overlapping BiLayers
 
Keywordmap overview material/CINC.co.ltd
Keywordmap overview material/CINC.co.ltdKeywordmap overview material/CINC.co.ltd
Keywordmap overview material/CINC.co.ltd
 

Tokyo.R#16 wdkz

  • 1. Rで大規模解析 aa Tokyo.R #16 和田 計也 サイバー系 CyberAgent, Inc.
  • 2. サイバー系 アジェンダ 1. 自己紹介 2. SAS 9.3が出た 3. Rをビルドしてみる(高速化できたらいいな) 4. 大規模データを取得してみる 5. 大規模データを扱ってみる 6. 処理の高速化をしてみる 7. 本日のハイライト 2011/08/27 1
  • 3. サイバー系 いまここ 1. 自己紹介 2. SAS 9.3が出た 3. Rをビルドしてみる(高速化できたらいいな) 4. 大規模データを取得してみる 5. 大規模データを扱ってみる 6. 処理の高速化をしてみる 7. 本日のハイライト 2011/08/27 2
  • 4. サイバー系 1.自己紹介 • 和田 計也(@wdkz) • 静岡県袋井市出身 • サイバー系企業でデータマイニングエンジニア職 • 創立記念日が3月18日 • 社長の出身地が福井県鯖江市 • 前職はバイオベンチャー • バイオマーカ探索してた • 学生時代は枯草菌の研究 2011/08/27 3
  • 5. サイバー系 いまここ 1. 自己紹介 2. SAS 9.3が出た 3. Rをビルドしてみる(高速化できたらいいな) 4. 大規模データを取得してみる 5. 大規模データを扱ってみる 6. 処理の高速化をしてみる 7. 本日のハイライト 2011/08/27 4
  • 6. サイバー系 2 SAS 9.3(通称SAS美)が出た.SAS美 という記事が出たが、実際のところ変更点はそこじゃなさげ ↓主な変更点はこんな感じ • HTML形式が標準の出力になった! • 新しいプロシージャー(Rでいうpackageみたいなの)がいくつかできた! • IMLプロシージャー使ってR呼び出せる! • GROOVYも使える! • その他! 2011/08/27 5
  • 7. サイバー系 いまここ 1. 自己紹介 2. SAS 9.3が出た 3. Rをビルドしてみる(高速化できたらいいな) 4. 大規模データを取得してみる 5. 大規模データを扱ってみる 6. 処理の高速化をしてみる 7. 本日のハイライト 2011/08/27 6
  • 8. サイバー系 3.1 Rのビルド • Windows 64bit OSでやってみる • 案外Windows でのビルド方法って ドキュメントないのね… 2011/08/27 7
  • 9. サイバー系 3.2 (参考)LinuxでRをコンパイル スコードからコンパイルする・Linux Linux(CentOS 5)用のRをソースコードからコンパイルする方法。 X11とCairo関係をあらかじめインストールしておく。(しておかないとX関連が インストールできなくてエラー吐くよ。) yum groupinstall "X Window System" yum groupinstall "X Software Development" yum install cairo-devel wget http://cran.md.tsukuba.ac.jp/src/base/R-2/R-2.13.1.tar.gz tar –xvf R-2.13.1.tar.gz cd R-2.13.1 ./configure make sudo make install X関連でエラーがとまらないときは仕方ないので ./configure --with-x=no make sudo make install 2011/08/27 8
  • 10. サイバー系 3.3 Rのソースコードをダウンロードースコードからコンパイルする・Win • 例えば http://cran.md.tsukuba.ac.jp/ • 適当なフォルダ(C:¥tools¥R¥R-2.13.1.tar.gzとか)に置いて展開しておく 2011/08/27 9
  • 11. サイバー系 3.4 ビルドツールをダウンロードコンパイルする・Win RtoolsをDL http://www.murdoch-sutherland.com/Rtools/ http://cran.md.tsukuba.ac.jp/ これ 2011/08/27 10
  • 12. サイバー系 3.5 ビルドツール(Rtools)をインストール 64bit版のTcl/Tkを選択 ★これ大事★ Rのソースを解凍した フォルダを指定。例えばC:¥tools¥R にR-2.13.1.tar.gzを置いて解凍した 場合はC:¥tools¥R¥R-2.13.1となる。 ここ間違うとビルド失敗します。 2011/08/27 11
  • 13. サイバー系 3.6 ビルド準備 • (たぶんRtoolsのインストール時に設定されてるはずだけど) Rtools¥binとRtools¥minGW64¥binをパスに追加する。 例えばC:¥tools¥Rtools¥bin;C:¥tools¥Rtools¥MinGW64¥bin • 必要ライブラリの準備 • 以下のlibpng, jpeg and libtiff sourcesをダウンロード http://www.libpng.org/ http://www.ijg.org/ ftp://ftp.remotesensing.org/pub/libtiff/ • 解凍してR-2.13.1¥src¥gnuwin32¥bitmapに置く tar -zxf libpng-1.4.5.tar.gz mv libpng-1.4.5 libpng tar -zxf jpegsrc.v8c.tar.gz tar -zxf tiff-3.9.4.tar.gz mv tiff-3.9.4/libtiff . rm -rf tiff-3.9.4 2011/08/27 12
  • 14. サイバー系 3.7 ビルド準備・続き • ビルド設定ファイルの編集 • R-2.13.1¥src¥gnuwin32¥MkRules.distを同一フォルダにコピペして MkRules.localと名付ける。 • 以下、このMkRules.localを編集 #JPEGDIR = jpeg-8c #PNGDIR = libpng #TIFFDIR = libtiff ↑3つのコメントアウトを外す WIN = 64 ↑32を64に変更 TMPDIR=C:¥DMZ ↑環境変数TMPDIRを作成して適当な場所(存在してればどこでも可)を設定 • ビルド時に、MkRules.local + MkRules.rulesがマージされてMkRulesという ファイルが自動的に生成され、それを基にビルドしていく。 2011/08/27 13
  • 15. サイバー系 3.8 完成させる • 最後・コマンドプロンプトで cd C:¥tools¥R¥R-2.13.1¥src¥gnuwin32 make all recommended Windowsの場合はここまで行ってね • バイナリ C:¥tools¥R¥R-2.13.1¥binフォルダ内によく見慣れた一式ができる。 2011/08/27 14
  • 16. サイバー系 3.9 バイトコンパイルする(とRが速くなるという噂) • MkRules.localを編集(以下の2行を追加) • R_COMPILE_PKGS=1 • R_COMPILER_SUPPRESS_ALL=1 • コマンドプロンプトで • make bytecode • ちなみに、普通のRでも関数単位でバイトコンパイルできます。 library(compiler) f <- cmpfun(<関数名>) 2011/08/27 15
  • 17. サイバー系 3.10 やったね! 2011年10月登場予定のR次期バージョンは、コンパイル済でやってきます! 2011/08/27 16
  • 18. サイバー系 3.11 BLASライブラリとしてGotoBLASを使う(とRが速くなるという噂)える http://prs.ism.ac.jp/~nakama/SurviveGotoBLAS2/ GotoBLASはメンテ・開発が終了してるので ここから、生きてるGotoBLASをダウンロード 自分のマシンのCPUに 合ったものをダウンロード binフォルダ内(64bitならx64内)の Rblas.dllファイルを置き換える 2011/08/27 17
  • 19. サイバー系 3.12 やる夫の憂鬱 ____ / \ / ⌒ ⌒\ / (●) (●) \ ホントはMKLを使うようにビルドしたかったお | (__人__) | 誰かやりかたわかったら教えてお / ∩ノ ⊃ / ( \ / _ノ | | .\ “ /__| | \ /___ / 2011/08/27 18
  • 20. サイバー系 3.13 RevolutionR Community Edition • 無料で利用可能です。 • http://www.revolutionanalytics.com/products/revolution-r.php • 普通のRと同じように使えます。(アイコンが違うぐらい) • BLASライブラリ,LAPACKライブラリがMKLのです!! 2011/08/27 19
  • 21. サイバー系 いまここ 1. 自己紹介 2. SAS 9.3が出た 3. Rをビルドしてみる(高速化できたらいいな) 4. 大規模データを取得してみる 5. 大規模データを扱ってみる 6. 処理の高速化をしてみる 7. 本日のハイライト 2011/08/27 20
  • 22. サイバー系 4.1 Hadoopクラスタの概念図 • データストアとしてHadoopを利用していることが多 いかと思います。 • RHIPE使うとか • 第14回R勉強会@東京(Tokyo.R#14)で『R が黄色い象に出会った • http://ml.stat.purdue.edu/rhipe/ 2011/08/27 21
  • 23. サイバー系 4.2 Hiveいいね! • Map-Reduce書いてもいいけど、書きたくない • HiveQLならSQL likeな記述でデータ扱える (勝手にMap-Reduceに変換してくれる) • https://cwiki.apache.org/confluence/display/Hive/Home • サイバーエージェントさんのようにClouderaのパッケージを導入しているな らHiveも使えるね • http://www.slideshare.net/toutouzone/hadoop-conferencejapan2011 2011/08/27 22
  • 24. サイバー系 4.3 RでhiveQLが使えるといいなぁ • 理想はRODBC library(RODBC) conn <- odbcConnect(“testdb”, “tokyor”, “yokkuns”) #繋いで x <- sqlQuery(conn, “select * from ameba_tbl”) #取得して odbcClose(conn) #切断する R rJava Java JDBC (自前クラス) Hive こんな感じのRHive欲しい Hadoop 2011/08/27 23
  • 25. サイバー系 4.4 rJavaの使い方1(基本編) #あらかじめJavaはインストールしておく install.packages(rjava) #rJavaのインストール library(rJava) .jinit() #JVMの起動 クラス名 コンストラクタの引数 #インスタンス化 .jnew(“java/lang/String”, “Hello World!”) # String s = new String(“Hello World!”); s <- .jnew(“java/lang/String”, “Hello World!”) インスタンス名 メソッド名(括弧なし) #メソッド #s.length() .jcall(s, “I”, “length”) .jcall(s, ”I”, “length”) [1] 12 戻り値の型 #文字列は注意 I ; integer D ; double (numeric) J ; long F ; float print(s) V ; void Z ; boolean C ; char (integer) B ; byte (raw) [1] "Java-Object: Hello World“ #こうやって取り出す .jstrVal(s) [1] "Hello World" 2011/08/27 24
  • 26. サイバー系 4.4 rJavaの使い方2(ちょっとマニアック編) #クラスパス指定&起動オプション付きでJVMの起動 .jinit(classpath=c(“C:¥¥tokyor¥¥Tokyor.jar”), parameters=c(”-Xms4g”, “-Xmx4g”)) #クラス変数, クラスメソッド #Math.pi with(J("java.lang.Math"), pi) #System.gc() with(J("java.lang.System"), gc()) #インスタンス化 実際はパッケージ名から書いてね # TokyoR tokyoR = new TokyoR(); *ちなみに配列の場合は tokyo.r <- .jnew(“Tokyo.R”) [+型 数値はすべてdouble型で渡されるので [I intの配列 Int型を明示して渡す [S Stringの配列 #メソッド #tokyoR.setNumber(16) [[I intの2次元配列 .jcall(tokyor “V”, “setNumber”, as.integer(16)) Javaの配列をRで使うには .jevalArray(x)で変換が必要 #tokyoR.getNumber() .jcall(tokyor, “I”, “getNumber”) L + クラス名 + ; Rの配列をJavaに渡すには [1] 16 とする .jarray(1:10) #戻り値がクラスの場合 .jcall(tokyor “Ljava/util/ArrayList;”, “getPersonList”) これは何故かint型になる 2011/08/27 25
  • 27. サイバー系 4.5 自作クラスを適当に作成 HiveConnector • こんな感じのJavaクラスを作って→ - conn : Connection • Rで関数定義 + init : void + connect2Hive ( server: String): void hiveConnect <- function(server, port=10000){ + hiveQuery(sql: String) : ArrayList<int[]> library(rJava) + closeConn: void + getHeader : int[] .jinit() connStr <- .jnew(“java/lang/String”, (paste(“jdbc:hive://”, server, “:”, port, “/default”, sep=“”))) hiveConn <- .jnew("jp/ameba/rhive/HiveConnector") .jcall(hiveConn, , "connect2Hive", connStr) return(hiveConn) } hiveqlQuery <- function(hiveConn, query){ header <- .jcall(hiveConn, “[S”, “getHeader”) res.list <- as.list(.jcall(hiveConn, “Ljava/util/ArrayList;","hiveQuery",.jnew("java/lang/String", query))) res.matrix<- matrix(unlist(lapply(res.list, function(x){strsplit(.jevalArray(x),",")})) , ncol=length(header), byrow=TRUE) return(res.matrix) 注!!実際にはこのまま } 使うとメモリが足りなくて 爆死します。 hiveClose <- function(hiveConn){ .jcall(hiveConn, "V", "closeHive") } 2011/08/27 26
  • 28. サイバー系 4.6 HiveのJDBCは0.7.1じゃなくて開発版の0.8.0を使う v 0.7.1(現行版) v 0.8.0-SNAPSHOT(開発版) <<interface>> <<interface>> ResultSet ResultSet HiveBaseResultSet HiveBaseResultSet {abstract} {abstract} +setFetchSize(rows : int) : void +setFetchSize(rows : int) : void HiveQueryResultSet HiveQueryResultSet -fetchSize : int +setFetchSize(rows : int) : void • 現行版のhive-jdbc-0.7.1.jarはfetchの指定ができないし、そもそもしてない ので我慢ならんくらい遅い。特にHiveは大きなデータを取得することが多い ためfetchが使える0.8.0を使う(か、0.7.1を修正して使う。) 2011/08/27 27
  • 29. サイバー系 4.7 Rhiveを使ってみる • hive-jdbc.jarを使うのに必要なjarファイル群*にクラスパスを設定して • Thrift Serverをサーバ側で起動しておいて • ローカルマシンのRから使う source(“Rhive.R”) hiveConn <- hiveConnect(“サーバ名かIP アドレス”) ameba_user <- hiveQuery(hiveConn, “select * from ameba_user”) hiveClose(hiveConn) 必要なのjar *common-lang3-*.jar, commons-logging-1.*.jar, hadoop-core-0.20*.jar, hive-cli-0.7*.jar, hive-common-0.7*.jar, hive-contrib-0.7*.jar, hive-exec-0.7*.jar, hive-hwi-0.7*.jar, hive-jdbc-0.8*.jar, hive-metastore-0.7*.jar, hive-service-0.7*.jar, log4j-1.2*.jar, slf4j-api-1.6*.jar, slf4j-log4j12-1.6*.jar, thrift-0.5*.jar, thrift-fb303-0.5*.jar, RHive.jar 2011/08/27 28
  • 30. サイバー系 4.8 rJavaは困った子(ちょっと注意) • メモリを解放してくれない • rm(list=ls()); gc()しても • Javaで明示的にnull入れるメソッド書いて、それをRから呼び出してJavaのSystem.gc()呼び出しても メモリ使用量が減らんのですよ • メモリ解放ソフトウェアを使うしかないかなぁ →せっかくならmicrosoft社製のがいいかな 1. Windows Server 2003 Resource Kit Toolsをダウンロード http://www.microsoft.com/downloads/details.aspx?familyid=9d467a69-57ff-4ae7-96ee-b18c4790cffd&displaylang=en 2. exeファイル(インストーラ)を解凍する 1. 7Zipとか使う http://sevenzip.sourceforge.jp/ 2. 「rktools.exeを解凍」→「rktools.msiを解凍」→empty.exeをコピー 3. C:¥WINDOWS¥system32 にコピー&ペースト (64bit OSでもここ) システム命令をRから呼び出しているだけ 3. Rではこう使う system(“empty Rgui.exe”) 2011/08/27 29
  • 31. サイバー系 いまここ 1. 自己紹介 2. SAS 9.3が出た 3. Rをビルドしてみる(高速化できたらいいな) 4. 大規模データを取得してみる 5. 大規模データを扱ってみる 6. 処理の高速化をしてみる 7. 本日のハイライト 2011/08/27 30
  • 32. サイバー系 5.1 Rで大規模データを扱いたい • Rの弱点 • データは基本的にオンメモリ • 大規模データ管理パッケージ • bigmemory • 良い点・・・複数プロセスから同時にアクセスできる。つまりクラスタ処理対応可能。通常の行列の よう にデータハンドリングできる。x[1:10,]とか • 悪い点・・・行列のみ。データフレームだめ。基本的に数値型だけ • ff • 良い点・・・行列、データフレーム両方いける。因子型もいける。 • 悪い点・・・クラスタ処理できない。(試してないけどたぶんforeachとかで並列処理はできそう。) データハンドリングの関数が専用 • とりあえず、bigmemoryパッケージを使うわ • 第10回TokyoWebMining勉強会の資料が詳しい http://www.slideshare.net/sfchaos/rbigmemory-tokyowebmining10 2011/08/27 31
  • 33. サイバー系 5.2 Rのbigmemoryパッケージ install.packages(bigmemory); library(bigmemory) #Rの行列からbigmemoryへ #あまり使わない backingfileを指定しないと、実体がディスク上ではなく ameba <- as.big.matrix(matrix(1:40, 10,4)) Shared memory上に作成されてしまうので注意 #bigmemory行列をあらかじめ作っておいて ameba <- big.matrix(10000000, 4, type=“integer”, init=-1, backingfile=“ameba.bin”) #カラム名をつける options(bigmemory.allow.dimnames=TRUE) 1000万行 x 4列の行列をinteger colnames(ameba) <- c(“ameba_id”, “create_year”, “create_month”, “create_day”) 型で初期値-1で作るわ。データ #追加していく の実体はカレントフォルダに 「ameba.bin」でヨロシク!って意 ameba[1:10,] <- matrix(1:40,10,4) 味です。 #csvファイルからbigmemoryへ #これが一番よく使う ameba <- read.big.matrix(“ameba.csv”, header=TRUE, sep=“,”, backingfile=“ameba.bin”, descriptorfile=“ameba.desc”) descriptorfileは省略可能。 その場合はbackingfile名+.descとなる 2011/08/27 32
  • 34. サイバー系 5.3 Rのbigmemoryパッケージ 2 データの実態はこのファイル #bigmemoryオブジェクトの永続化 ameba <- read.big.matrix(“ameba.csv”, header=TRUE, sep=“,”, backingfile=“ameba.bin”, descriptorfile=“ameba.desc”) でも次回、このデータを使う場合はこっちを明示 #Rを再起動後に読み込み ameba <- attach.big.matrix(“ameba.desc”) #行列サイズ確認 dim(ameba) #行列要素にアクセス ameba[,] #全データ出力だけどやってはダメだよ ameba[1:10, ] #先頭10行 #集計もできる library(bigtabulate) summary(ameba) bigtable(ameba, “create_year”) #table(ameba[,2])でも同じ結果が得られるけど速度がぜんぜん違う #glmもできるしk-meansもできる library(biganalytics) 2011/08/27 33
  • 35. サイバー系 5.4 Rhiveから直接bigmemoryへ • RHiveで取得するデータって普通はgigabyte越えだから、直接bigmemory化 されるといいね!!でも問題がちらほら… 1. メモリの問題 R上の変数 Java rJava R上の変数 Java (オンメモリ) (オンメモリ) rJava CSVファイル bigmemory bigmemory (ディスク上) (ディスク上) 2. 型の問題 bigmemoryだと数値  Java側で文字列を数値に変換(変換表はHashMap) RでそのHashMapを受けとるとかの工夫が必要 2011/08/27 34
  • 36. サイバー系 5.5 ちなみにRのhashパッケージが結構便利 install.packages(hash) Javaなんかでよ く使うHashみた library(hash) いなのをがRでも 使えるよって話 h <- hash() .set(h, “Tokyo.R16”, “DeNA”) .set(h, a=1, b=2, c=3) #一括でもセットできる。 h <- hash(a=1, b=2, c=3) #生成時に一括セットもできる values(h, “Tokyo.R16”) [1] “DeNA” clear(h) #これしないとメモリ解放しないらしい rm(h) #だから↑rmする前にclearしておくこと 2011/08/27 35
  • 37. サイバー系 いまここ 1. 自己紹介 2. SAS美の近況 3. Rをビルドしてみる(高速化できたらいいな) 4. 大規模データを取得してみる 5. 大規模データを扱ってみる 6. 処理の高速化をしてみる 7. 本日のハイライト 2011/08/27 36
  • 38. サイバー系 6.1 処理の高速化 • 並列処理して高速化してみる • Rは基本シングルコアでしか計算しない。 • とはいえ、大規模データ扱うなら(しかもコアが余ってるなら)並列処理したいよね • めちゃくちゃショボイ例で申し訳ない。 install.packages("foreach") install.packages(“doSMP”) #Linux, MacOSXはdoMCでもいいけど、WindowsはdoMCが使えないからdoSMPを使う getDoParWorkers() #現状の使用コア設定数を確認 #[1] 1 #このままだとコア1つしか使わない w <- startWorkers(4) #並列処理する数を設定 registerDoSMP(w) #これで並列計算用のプロセス(windowsだったらRterm.exe)が多数起動する。 getDoParWorkers() #使用コア設定数が変更されたか確認 #[1] 4 %dopar%を%do%にすると並列計算しないよ foreach(i = 1:N, .combine = “c”) %dopar% { #for文のかわりにforeach文を使う sum(rnorm(1e+6)) } cだと戻り値がベクトルになる。ここを例えばcbindにすると横に長いmatrixで戻ってくる stopWorkers(w) #最後にWorkerを消し去る #↑これしないとR(windowsだったらRgui.exe)を終了してもプロセス(windowsだったらRterm.exe)が多数残ってしまう。 #これせずにRを終了させて残ってるRterm.exeプロセスをkillしても次回にRを起動してからstartWorkers()呼んだ時に 警告メッセージ: 1: In startWorkers(12) : there is an existing doSMP session using doSMP1 #こんなんでる。その時は↓みたくしてセッションを切るとOK rmSessions(qnames="doSMP1") もう仕分け無い 2011/08/27 37
  • 39. サイバー系 6.2 Revolution R Enterprise Editionがなかなかいいかも http://www.revolutionanalytics.com/why-revolution-r/which-r-is-right-for-me.php これ、RevoScaleRというパッケージ なんだが、なかなか良さそう。 1. データはファイルシステムに置く 2. ベクトル、行列、データフレーム使える (リストはダメっぽい) 3. 数値型、因子型、文字列扱える 4. 計算処理は自動的に並列処理してく れる 5. もうじきクラスタ計算に対応 2011/08/27 38
  • 40. サイバー系 6.3 Revolution R Enterprise Edition • $1,000/year/user • HPCクラスタだといくらかわかんない 2011/08/27 39
  • 41. サイバー系 いまここ 1. 自己紹介 2. SAS美の近況 3. Rをビルドしてみる(高速化できたらいいな) 4. 大規模データを取得してみる 5. 大規模データを扱ってみる 6. 処理の高速化をしてみる 7. 本日のハイライト 2011/08/27 40
  • 42. サイバー系 7. 本日のハイライト 1. 自己紹介 @wdkzはサイバー系 2. SAS 9.3出たよ SAS 9.3出たけど… 3. Rをビルドしてみる Windowsマシンは窓から投げ捨てたくなる 4. 大規模データを取得してみる RでHiveQLを使って直接データ取得する 5. 大規模データを扱ってみる bigmemoryつかう。HiveQL->bigmemoryとか。 6. 処理の高速化をしてみる foreachとdoSMPで並列化できる。 RevoScaleRもいいね! 2011/08/27 41