我说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。
答案 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)