単一のマルチコアマシン上の1つのテキストファイルに対して、Rと並行して反復することは可能ですか?コンテキストの場合、テキストファイルは250〜400MBのJSON出力の間にあります。R内で並列にreadLinesを実行することができます。
EDIT:
は、ここで私はで遊んでてきたいくつかのコードサンプルです。私の驚いたことに、並列処理は勝利しませんでした - ただ基本的なlapply - しかし、これは私の部分でユーザーのエラーが原因である可能性があります。さらに、多数の大きなファイルを読み込もうとすると、私のマシンが息を吹きました。ここ
## 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番目のコードサンプルによる非平行ファイル・システムIOの性質readLines()
とおそらく
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))
JSONファイルの読み込みやJSONファイルの解析で問題がありますか? –
どちらもありません。単純なforループを使用しようとすると、私のマシンは最終的にフリーズします。私は、各JSONエントリに対して関数を実行しようとしました。別のrdsファイルを読み込んで保存するなど、すべてのオプションで、メモリ使用量を意識し、可能な限り最適化と消去を試みました。いくつかのアイデアはひどいものでしたが、最終的には、Base Rだけで大きなデータセットを「分析」する方法を見つけ出し、現時点ではより良いソリューションが存在するという事実を無視しています。 – Btibert3
再現可能な例は、私たちがフィードバックを提供することをはるかに簡単にします。 –