2017-03-12 51 views
0

我正在读取超过100个文件的目录中的csv文件,然后我正在做一些东西,我有8个核心cpu,所以我想在并行模式下完成更快。如何在R中进行并行处理?

我写了一些代码,但它不为我工作 - (使用Linux)

library(data.table) 
library(parallel) 

# Calculate the number of cores 
no_cores <- detectCores() - 1 
# Initiate cluster 
cl <- makeCluster(no_cores) 

processFile <- function(f) { 

    # reading file by data.table 
    df <- fread(f,colClasses = c(NA,NA, NA,"NULL", "NULL", "NULL")) 

    A <- parLapply(cl,sapply(windows, function(w) {return(numOverlaps(w,df))})) 

    stopCluster(cl) 
} 

files <- dir("/home/shared/", recursive=TRUE, full.names=TRUE, pattern=".*\\.txt$") 

# Apply the function to all files. 

result <- sapply(files, processFile) 

正如你看到的我想在processFile(A),但它不能正常工作运行的功能!

如何在并行处理模式下运行该功能?

回答

2

你有这个概念。您需要通过parLapply文件列表,然后处理它们。匿名函数应该执行处理单个文件并返回所需结果的整个过程。

我的建议是首先使用常规lapplysapply进行此项工作,然后才能启动并行后端,导出所有您需要的必要库和对象。

parLapply(cl, X = files, FUN = function(x, ...) { 
    ... code for processing the file 
}) 
+0

因为我使用“data.table”包和读表时以“FREAD”(内部parLapply功能)我有错误,我无法读取文件时,它不适合我的工作! –

+0

@BigData没有(可重现的)代码很难说。如果你提供了一段代码(生成数据,写入磁盘,用fread读取...)我可以尝试任何使它并行工作。 –

+0

我更新了我正在读fread函数的代码,我的意思是我在函数中包含了这一行 - 我遇到的错误是:checkForRemoteErrors(val)中的错误: 7个节点产生错误;第一个错误:无法找到函数“fread” - –