【发布时间】:2019-09-27 06:21:08
【问题描述】:
当我使用多个处理来修改 R data.table 中的值时,我发现一些非常令人困惑的事情。
我尝试通过使用函数来修改值。它使用一个核心运行良好,并且 data.table 中的值已成功更改。但是当我使用多核时,它无法更改data.table中的值。
这让我很困惑。有谁知道为什么?
library(data.table)
library(parallel)
aa <- as.data.table(iris)
aa[,tt:=0]
# modify aa$tt in place
main <- function(x){
#set(aa,x,6L,5)
aa[x,tt:=5]
return(NULL)
}
# aa$tt changed
mclapply(1:nrow(aa), main, mc.cores = 1)
# aa$tt unchanged
mclapply(1:nrow(aa), main, mc.cores = 2)
【问题讨论】:
-
想想当代码并行运行时实际发生了什么。如果您理解这一点,那么就地修改不能并行工作的原因就很明显了。
-
您可能需要阅读
mclapply函数 (rdocumentation.org/packages/parallel/versions/3.3.2/topics/…) 和data.table的setDTthreads(rdocumentation.org/packages/data.table/versions/1.12.2/topics/…) 的文档。在任何情况下,您的示例aa[, tt := 5]已经使用data.table将非常快,即使在大型数据集上也是如此(请参阅stackoverflow.com/questions/19082794/…)。 -
我用上面的例子来展示一个核心和多个核心之间的不同结果。最终的数据集是我的目的。对于上述情况,
aa[,t:=5]绝对够用了。
标签: r multithreading data.table