【发布时间】:2013-03-11 21:45:41
【问题描述】:
是否可以在单个多核机器上与 R 并行迭代单个文本文件?就上下文而言,文本文件介于 250-400MB 的 JSON 输出之间。
编辑:
这是我一直在玩的一些代码示例。令我惊讶的是,并行处理并没有获胜——只是基本的 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)
这是第二个代码示例
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 来“分析”更大数据集的方法,而忽略了目前存在更好解决方案的事实。
-
一个可重复的示例将使我们更容易提供反馈。
标签: r parallel-processing