【发布时间】:2014-11-21 14:46:09
【问题描述】:
我正在尝试将一个大的 data.frame 与一个小的 data.frame 合并,并并行化计算。下面的代码完美运行,最大限度地利用了我机器的所有内核:
len <- 2000000
set.seed(666)
dat = paste(sample(letters, len, rep = T), sample(0:9, len, rep = T), sample(letters, len, rep = T), sep = '') # create a vector of strings that are 3-long
head(dat)
set.seed(777)
num <- sample(0:9, len, replace = T)
bigDF <- data.frame(dat = dat, num = num)
smallDF <- data.frame(num = 0:9, caps = toupper(letters[1:10]))
startP <- 1
chunk <- 10000
nodes <- detectCores()
cl <- makeCluster(nodes)
registerDoParallel(cl)
mergedList <- foreach(i = 0:(len/chunk - 1)) %dopar% {
tmpDF = bigDF[(startP + i * chunk):(startP - 1 + (i + 1) * chunk), ]
merge(tmpDF, smallDF, by = 'num', all.x = T)
}
stopCluster(cl)
一旦我将向量 dat 更改为包含 5 长的字符串,并行性就会崩溃,尽管没有错误或警告,但只有 1 个内核参与计算:
len <- 2000000
set.seed(666)
dat = paste(sample(letters, len, rep = T), sample(0:9, len, rep = T), sample(letters, len, rep = T), sample(letters, len, rep = T), sample(letters, len, rep = T), sample(letters, len, rep = T), sep = '') # create a vector of strings that are 6-long
head(dat)
set.seed(777)
num <- sample(0:9, len, replace = T)
bigDF <- data.frame(dat = dat, num = num)
smallDF <- data.frame(num = 0:9, caps = toupper(letters[1:10]))
startP <- 1
chunk <- 10000
nodes <- detectCores()
cl <- makeCluster(nodes)
registerDoParallel(cl)
mergedList <- foreach(i = 0:(len/chunk - 1)) %dopar% {
tmpDF = bigDF[(startP + i * chunk):(startP - 1 + (i + 1) * chunk), ]
merge(tmpDF, smallDF, by = 'num', all.x = T)
}
stopCluster(cl)
为什么会出现这种不一致,如何解决?在特定示例中,如果将dat 索引为整数,则代码有效。但索引并不是所有情况下的答案。为什么字符串的长度对所使用的核心数量很重要?
【问题讨论】:
-
是否为非工作案例生成了子 R 进程?你的空闲内存怎么样?
-
看来我可以在 Win7-64bit, R3.1.1 上重现这个问题。大量可用内存; Rscript 孩子永远不会启动。稍后会有更多新闻:-)
-
@blindJesse 我有千兆字节的空闲内存,所以不是问题。 @Carl:我的系统规格与您的相同。请注意,奇怪的是,如果
dat由 4 长字符串组成,则第二个核心对计算的部分贡献。对于 5 长或更长的琴弦,只有一个核心在工作。
标签: r foreach parallel-processing doparallel