是否可以在与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))
答案 0 :(得分:7)
答案取决于实际问题:并行读取文件或并行处理文件。
您可以将JSON文件拆分为多个输入文件并并行读取,例如使用plyr
函数结合并行后端:
result = ldply(list.files(pattern = ".json"), readJSON, .parallel = TRUE)
可以使用现在集成在基础R中的parallel
包来注册后端。或者您可以使用doSNOW
包,有关详细信息,请参阅this post on my blog。
在这种情况下,最好的办法是将整个数据集读入字符向量,拆分数据,然后使用并行后端和plyr
函数。
答案 1 :(得分:2)
可能不在readLines()
。当然,如果您使用并行NFS或HDFS之类的东西,则此限制将不适用。但假设您使用的是“标准”体系结构,则无法并行化readLine()
次呼叫。
您最好的选择可能是读取整个文件,因为&lt; 500MB可能适合内存,然后在您已经读入对象后并行化处理。