在R中使用具有多线程的包

Sin*_*ity 5 multithreading r

我需要对R应用程序进行多线程处理,因为它需要5分钟才能运行,并且仅使用15%的计算机可用CPU。

一个需要一段时间才能运行的过程的示例是计算包含n层的非常大的栅格堆栈的平均值:

mean = cellStats(raster_layers[[n]], stat='sd', na.rm=TRUE)
Run Code Online (Sandbox Code Playgroud)

使用并行库,我可以创建一个新集群并将函数传递给它:

cl <- makeCluster(8, type = "SOCK")
parLapply(cl, raster_layers[[1]], mean_function)
stopCluster(cl)
Run Code Online (Sandbox Code Playgroud)

均值函数为:

mean_function <- function(raster_object)
{
result = cellStats(raster_object, stat='mean', na.rm=TRUE)
return(result)
}
Run Code Online (Sandbox Code Playgroud)

除了看不到使用cellStats所需的“ raster”包外,此方法可以正常工作。因此无法说出cellStats没有功能 我试图在函数中包括库,但这无济于事。

raster软件包随附了一个集群函数,它可以看到函数cellStats,但是据我所知,集群函数必须返回一个栅格对象,并且必须传递给我一个不够灵活的单个栅格对象,我需要能够传递对象列表并返回一个数字变量... 如果只有并行库可以看到栅格包功能,我可以使用并行库对普通群集进行处理。

那么,有人知道我如何通过R中的多线程将程序包传递给节点吗?或者,也许如何从栅格簇函数返回单个值?

Sin*_*ity 4

解决方案来自 Ben Barnes,谢谢。

下面的代码工作正常:

mean_function <- function(variable)
{
result = cellStats(variable, stat='mean', na.rm=TRUE)
return(result)
}

cl <- makeCluster(procs, type = "SOCK")
clusterEvalQ(cl, library(raster))   
result = parLapply(cl, a_list, mean_function)
stopCluster(cl)
Run Code Online (Sandbox Code Playgroud)

其中procs是您希望使用的处理器数量,它必须与您传递的列表的长度相同(在本例中称为a_list)。

在这种情况下, a_list需要是包含栅格的列表,可以使用 cellStats 函数对其进行操作以计算平均值。因此,a_list只是一个栅格列表,包含栅格的procs数量。