将parLapply与data.table的rbindlist一起使用会使CPU超过100%

时间:2019-03-02 09:42:28

标签: r parallel-processing data.table rbindlist

考虑以下代码块:

library(data.table)
library(parallel)

random_function<-function(i){
  n<-1000000
  big_list<-list("vector")
  for (k in 1:100){
    big_list[[k]]<-data.table(rnorm(n),rnorm(n))
  }
  rbindlist(big_list,use.names = TRUE,fill=TRUE)
}


cl<-makeCluster(8)
clusterExport(cl,"random_function")
clusterCall(cl,function()library(data.table))
parLapply(cl,1:1000,random_function)
stopCluster(cl)

当我在有36个线程的计算机上运行它时,所有线程突然都被激活(即,我在创建集群时指定的8个线程超过了100%的负载)。

这仅在data.table 1.12.0中发生。一切都与data.table_1.11.8完美配合。这是一个错误还是我做错了什么?看来问题出在rbindlist之内,也就是说,如果我不将其放在函数rbindlist中,则我的8个线程的负载不会超过100%。enter image description here

这是我的会话信息:

> sessionInfo()
R version 3.5.2 (2018-12-20)
Platform: x86_64-pc-linux-gnu (64-bit)
Running under: Ubuntu 18.04.2 LTS

Matrix products: default
BLAS: /usr/lib/x86_64-linux-gnu/blas/libblas.so.3.7.1
LAPACK: /usr/lib/x86_64-linux-gnu/lapack/liblapack.so.3.7.1

locale:
 [1] LC_CTYPE=en_US.UTF-8       LC_NUMERIC=C               LC_TIME=en_US.UTF-8        LC_COLLATE=en_US.UTF-8    
 [5] LC_MONETARY=en_US.UTF-8    LC_MESSAGES=en_US.UTF-8    LC_PAPER=en_US.UTF-8       LC_NAME=C                 
 [9] LC_ADDRESS=C               LC_TELEPHONE=C             LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C       

attached base packages:
[1] parallel  stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
[1] data.table_1.12.0

loaded via a namespace (and not attached):
[1] compiler_3.5.2 tools_3.5.2   

0 个答案:

没有答案