【问题标题】:different results using one core and multiple cores to modify data.table一核多核修改data.table的不同结果
【发布时间】: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)

【问题讨论】:

标签: r multithreading data.table


【解决方案1】:

简答:并行子进程处理aa的副本。

更长的答案:

mclapply 使用分叉的“子”进程(= 主要是父进程的副本*),因此处理复制的数据(在您的情况下为 aa)。

这意味着在子进程中就地更改aa 不会在主进程中修改aa

有关详细信息,请参阅?parallel::mclapply,例如。如何使用作为返回值 (!) 的最终结果。

*) 实际上在Linux下fork是使用copy-on-write内存页来实现的以提高性能

【讨论】:

  • 感谢您的回复。这是否意味着如果我使用一个核心就不会复制数据?
  • 是的,没有分叉没有复制(由操作系统)。 R 所做的是另一件事(写时复制语义),但由于您使用的是 data.table := 不会复制而是就地覆盖。因此,这是您可以获得的最佳性能。如果您使用新功能setDTthreads(致谢@ccdt 在此提及!)您甚至可以提高性能。在 use!R 2019 大会上查看 @arun 关于 data.table 新功能和性能基准的出色更新:user2019.fr/static/pres/t258038.pdf
猜你喜欢
  • 1970-01-01
  • 2013-01-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-05
  • 2015-07-06
  • 1970-01-01
  • 2011-12-14
相关资源
最近更新 更多