【问题标题】:Reduice time computation using parallel package in R使用 R 中的并行包减少计算时间
【发布时间】:2015-04-25 19:51:33
【问题描述】:

我搜索了但我找不到类似的问题,所以如果这是一个重复的问题,请提前道歉。我正在尝试从 R 中的 for 循环中生成数据框。

我想做的是使用包并行计算N=10^9不同值的函数。

这是我做的代码:

1- 生成数据样本,以及模型的所有参数:

Data=data.frame(C=rnorm(10,150,12),K=rnorm(10,95,7),S=rnorm(10,125,9.5),T=rnorm(10,25,5))
round(Data, digits = 0)
para_h<-c(0.001,0.002,0.0000154,0.00052,-0.68)

2- 我使用的功能:

FC_Q<-function(x,para_h,Data){
  T=Data$T; S=Data$S; K=Data$K; r=0.05/250
  w=para_h[1];b=para_h[2];a=para_h[3];  c= para_h[4];  neta=para_h[5]

  nu=(1/(neta^2))*(((1-2*neta)^(1/2))-1)
  u=1i*x ; Z=length(S)

  FC_Q <- rep(NA, Z)
  for (i in 1:Z){
    A_Q=0 ; B_Q=0
    steps<-round(T[i]*250,0)  
    for (j in 1:steps){
      A_Q= A_Q+ r*u + w*B_Q-(1/2)*log(1-2*a*(neta^4)*B_Q)
      B_Q= b*B_Q+u*nu+ (1/neta^2)*(1-sqrt((1-2*a*(neta^4)*B_Q)*( 1- 2*c*B_Q - 2*u*neta)))
    }
    FC_Q[i]= exp(log(S[i])*u + A_Q + B_Q*(0.0012))*exp(-r*T[i])
  }
  return(FC_Q)
}

我遇到的问题是由于N=10^9 的计算维度,它在我的计算机上需要 1 个小时。

这是我用来进行循环计算的代码for

N=10^9 ; alpha=2 ; delta= 0.25; lambda=(2*pi)/(N*delta); r=0.05/250

Res=c()
for (i in 1:N){
  phi= ((FC_Q(((delta*(i-1))-(alpha+1)*1i),para_h,Data))/(alpha^2+alpha-(delta*(i-1))^2+1i*(2*alpha+1)*(delta*(i-1))))*delta*exp(1i*(delta*(i-1))*b)
  Res=rbind(Res,phi)
}  

这段代码需要很多时间,我想使用的是类似的东西:

library(parallel)
cl <- makeCluster(detectCores())
result <- clusterApply(cl,1:10^9,FC_Q)
values <- do.call(rbind,result)
stopCluster(cl)

是否可以使用包并行来减少执行时间,如果可以,请建议我一个解决方案。我知道,我在 R 中使用了很多不好的东西,但我想不出更好的解决方案。

任何改进此过程的更正和建议!请随时分享您在 R 中的现有代码。

谢谢。

【问题讨论】:

  • 这个问题和你之前的问题有什么不同?

标签: r performance for-loop parallel-processing vectorization


【解决方案1】:

你的问题有点开放。 如果您的目标是在多个内核/处理器上运行代码,最简单的解决方案之一是使用并行包中的 mclapply。由于它使用分叉,因此无法在 Windows 机器上开箱即用。

使用它:

num_cores <- 12
res <- mclapply(1:N, function(i) ((FC_Q(((delta*(i-1))-(alpha+1)*1i),para_h,Data))/(alpha^2+alpha-(delta*(i-1))^2+1i*(2*alpha+1)*(delta*(i-1))))*delta*exp(1i*(delta*(i-1))*b), 
                mc.cores = num_cores)

mclapply 返回一个列表。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-21
    • 1970-01-01
    相关资源
    最近更新 更多