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

时间:2015-04-13 12:10:01

标签: r multithreading

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

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

mean = cellStats(raster_layers[[n]], stat='sd', na.rm=TRUE)

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

cl <- makeCluster(8, type = "SOCK")
parLapply(cl, raster_layers[[1]], mean_function)
stopCluster(cl)

其中平均函数是:

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

此方法工作正常,但它无法看到使用 cellStats 所需的'raster'包。所以它没有说 cellStats没有功能。我已经尝试在函数中包含该库但这没有帮助。

raster包附带一个集群功能,它可以看到函数cellStats,但据我所知,集群函数必须返回栅格对象,并且必须传递单个光栅对象对我来说不够灵活,我需要能够传递一个对象列表并返回一个数字变量...我可以使用 parallel <正常聚类来做/ strong>库,只要它能看到光栅包函数。

那么,是否有人知道如何将包传递给R中具有多线程的节点?或者,我如何从栅格集群函数返回单个值?

1 个答案:

答案 0 :(得分: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)

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

在这种情况下,

a_list 需要是一个包含栅格的列表,可以使用它来操作以使用cellStats函数计算平均值。因此, a_list 只是一个栅格列表,包含 procs 栅格数量。