我正在处理两个data.frames列表,目前运行类似于此的东西(我正在做的简化版本):
df1 <- data.frame("a","a1","L","R","b","c",1,2,3,4)
df2 <- data.frame("a","a1","L","R","b","c",4,4,4,4,4,44)
df3 <- data.frame(7,7,7,7)
df4 <- data.frame(5,5,5,5,9,9)
L1 <- list(df1,df2)
L2 <- list(df3,df4)
myfun <- function(x,y) {
difa = rowSums(abs(x[c(T,F)] - x[c(F,T)]))
difb=sum(abs(as.numeric(y[-c(1:6)])[c(T,F)] - as.numeric(y[-c(1:6)])[c(F,T)]))
diff <- difa + difb
return(diff)
}
output1 <- mapply(myfun, x = L2, y = L1)
每个列表中的数据帧数相同,一个列表中的每个数据帧对应另一个列表中的数据帧。一个列表中的数据帧包含单个行,而第二个列表中的其他数据帧包含动态行数;因此使用sum和rowSums。数字列的数量也是动态的,但在相应的数据帧之间始终相同。
我希望在处理每个列表1-10万个数据帧时使用并行处理来加速计算。我尝试了以下方法:
library(parallel)
if(detectCores() > 1) {no_cores <- detectCores() - 1}
if(.Platform$OS.type == "unix") {ptype <- "FORK"}
cl <- makeCluster(no_cores, type = ptype)
clusterMap(cl, myfun, x = L2, y = L1)
stopCluster(cl)
但是,由于我正在使用大量数据,这将很快填满内存。我假设由于加载了每个集群中的整个数据帧列表?我是R中的并行处理的新手,已经读过根据一些没有自动实现它的并行函数所需的可用内核数量将数据拆分成块,所以我尝试了以下不起作用:
library(parallel)
if(detectCores() > 1) {no_cores <- detectCores() - 1}
if(.Platform$OS.type == "unix") {ptype <- "FORK"}
cl <- makeCluster(no_cores, type = ptype)
output1 <- clusterMap(cl, myfun, x = split(L2, ceiling(seq_along(L2)/no_cores)), y = split(L1, ceiling(seq_along(L1)/no_cores)))
stopCluster(cl)
有人可以帮助新手吗?我一直在阅读的大部分信息都使用parApply / parLapply / etc.我能够使用mcmapply,但由于它只使用分叉,我不能使用它。我的代码必须在unix和windows系统上运行;因此我测试OS.type将其设置为fork。
更新:所以我认为它正在解析它正在将块分析到不同的集群,但数据类型与集群内的二元运算符不一致。问题似乎与它成为数据框列表的列表有关,并在集群中被视为非数字。