使用更快的方法适用于大型阵列(可能涉及并行化)?

时间:2018-11-09 19:09:09

标签: arrays r apply doparallel

我说R中有一个大数组,

A = array(rnorm(100*100*30*30*100),dim=c(100,100,30,30,100))

我想在第4维中找到小于1的第一个条目:

first_entry = apply(A,c(1,2,3,5),function(x) min(which(x < 1)))

由于阵列太大,这在我的计算机上花费了大约20秒的时间,并且将来我将对许多阵列进行此操作。 for循环的速度大致相同。我也尝试过使用parApply,但是它花费的时间大约相同,甚至更长。可能我的功能不够“复杂”,无法并行化以实现速度提升。有更快的方法吗?实际上,我希望能够理想地完成的工作是将另一个数组B(具有与A相同的尺寸)中的值设置为0。因此,类似

B[first_entry] = 0

请注意,鉴于“ apply”(如上)的当前输出,此操作不起作用,因为first_entry的尺寸为100x100x30x100。

1 个答案:

答案 0 :(得分:0)

我简化了您的示例(我的机器可能比您的机器慢!),并增加了一些时间度量。当我使用parApplym而不是applym时,代码要快一些(parApply为2.4秒,而apply为3.8秒)。

如果parApply确实在您的计算机上产生了相似的结果,您是否考虑以多线程方式运行更广泛的任务?您提到您将对许多阵列执行此操作。因此,您可以同时运行多个查询吗?

# Create data
A = array(rnorm(100*100*30),dim=c(100,100,30))

# Using apply
start.time <- Sys.time()
first_entry = apply(A,c(1,2,3),function(x) min(which(x < 1)))
print(Sys.time() - start.time)

# Load packages
library(parallel)

# Create cluster and export
nrCores <- detectCores()
cl <- makeCluster(nrCores)
clusterExport(cl=cl, varlist=c("A"))

# Using parApply
start.time <- Sys.time()
first_entry = parApply(cl=cl,A,c(1,2,3),function(x) min(which(x < 1)))
print(Sys.time() - start.time)