使用所有内核而不是所有线程进行mclapply

问题描述

我有一个带8个线程的4核Mac。我对mclapply()的理解是,它应该利用8个线程作为处理器,但是当我运行脚本时,我只能看到4个线程在工作。在我的示例中,我使用的是嵌套列表,因为在我的实际工作中,我有一个6层的嵌套列表,需要花几天的时间才能运行。我将在24核心Linux上运行我的脚本,因此我试图了解如何最好地利用我的资源。

library(zoo)

x = replicate(150000,rnorm(24)) 
list1 <- list(elem1 <- x,elem2 <- x)
nested_list <- list(elem1 = list1,elem2 = list1)

mclapply(nested_list,FUN = function(x){
  lapply(x,FUN = function(y){
    rollmean(y,7)
  })
})

当我在运行此脚本的同时监视cpu时,会看到此内容

enter image description here

偶数内核似乎根本无法工作,而内核1似乎有能力做更多。

mclapply()是否不如lapply()的替代产品那样简单?我正在使用的实际功能来自需要使用的特定程序包,因此我无法将功能更改为更有效(即使用dplyr函数而不是base函数)。请告知我如何更有效地使用资源。

解决方法

mclapply和分支通常可以受内存限制吗?我有一个在24核心Linux上运行的脚本。在脚本的开头,mclapply(,mc.cores = 18)使用了18个内核。完成脚本的一半,在工作区变得很大(〜3.5 GB)之后,使用mclapply(,mc.cores = 18)时只有2个内核可以工作。

我清理了内存,这改善了分叉。我尝试了mclapply(,mc.cores = 18),但是通过监视内核的CPU使用率,我发现仍然只有8或9个内核在工作。我想知道这是否仍然是由于派生所需的内存而引起的。我的理解是,在分叉时,将为每个fork创建一个新的R会话。这些会话中的每个会话都需要加载工作空间/库,这对于大量的fork可能会占用大量内存。在处理大数据时,有什么方法可以避免这种内存限制,以便更好地并行化?

这是我用来清除内存的代码;

# Clear plots
if(!is.null(dev.list())) dev.off()
# Clear console
cat("\014") 
# Clean workspace
rm(list=ls())

每个http://www.sthda.com/english/articles/17-tips-tricks/75-clear-user-interface-and-free-memory-in-rrstudio/