6

Rと並行して、単一のマルチコアマシンで単一のテキストファイルを反復処理することは可能ですか? コンテキストとして、テキスト ファイルは 250 ~ 400 MB の JSON 出力です。

編集:

ここに私が遊んでいるいくつかのコードサンプルがあります。驚いたことに、並列処理は成功しませんでした - 基本的なラップリーだけです - しかし、これは私の側のユーザー エラーが原因である可能性があります。さらに、多数の大きなファイルを読み込もうとすると、マシンが詰まることがありました。

## test on first 100 rows of 1 twitter file
library(rjson)
library(parallel)
library(foreach)
library(plyr)
N = 100
library(rbenchmark)
mc.cores <- detectCores()
benchmark(lapply(readLines(FILE, n=N, warn=FALSE), fromJSON),
          llply(readLines(FILE, n=N, warn=FALSE), fromJSON),
          mclapply(readLines(FILE, n=N, warn=FALSE), fromJSON),
          mclapply(readLines(FILE, n=N, warn=FALSE), fromJSON, 
                   mc.cores=mc.cores),
          foreach(x=readLines(FILE, n=N, warn=FALSE)) %do% fromJSON(x),
          replications=100)

これが2番目のコードサンプルです

parseData <- function(x) {
  x <- tryCatch(fromJSON(x), 
                error=function(e) return(list())
                )
  ## need to do a test to see if valid data, if so ,save out the files
  if (!is.null(x$id_str)) {
    x$created_at <- strptime(x$created_at,"%a %b %e %H:%M:%S %z %Y")
    fname <- paste("rdata/",
                   format(x$created_at, "%m"),
                   format(x$created_at, "%d"),
                   format(x$created_at, "%Y"),
                   "_",
                   x$id_str,
                   sep="")
    saveRDS(x, fname)
    rm(x, fname)
    gc(verbose=FALSE)
  }
}

t3 <- system.time(lapply(readLines(FILES[1], n=-1, warn=FALSE), parseData))
4

2 に答える 2

7

答えは、問題が実際に何であるかによって異なります。つまり、ファイルを並行して読み取るか、ファイルを並行して処理するかです。

並行して読む

JSON ファイルを複数の入力ファイルに分割plyrし、並列バックエンドと組み合わせた関数を使用して、それらを並列に読み取ることができます。

result = ldply(list.files(pattern = ".json"), readJSON, .parallel = TRUE)

バックエンドの登録は、おそらくparallelベース R に統合されたパッケージを使用して行うことができます。または、doSNOWパッケージを使用することもできます。詳細については、私のブログのこの投稿を参照してください。

並列処理

このシナリオでは、データセット全体を文字のベクトルに読み取り、データを分割してから、関数などと組み合わせた並列バックエンドを使用するのが最善の策plyrです。

于 2012-11-26T19:20:04.240 に答える
2

readLines()非並列ファイルシステム IO の性質上、おそらくそうではありません。もちろん、パラレル NFS や HDFS などを使用している場合、この制限は適用されません。readLine()ただし、「標準」アーキテクチャを使用していると仮定すると、呼び出しを並列化することは現実的ではありません。

あなたの最善の策は、おそらく<500MBがメモリに収まる可能性があるため、ファイル全体を読み込んでから、オブジェクトが既に読み込まれたら処理を並列化することです。

于 2012-11-26T19:14:26.563 に答える