2015-04-25 27 views
0

我搜索了但我找不到類似的問題,所以如果這是一個重複的問題,請提前道歉。我正嘗試從R中的for循環中生成一個數據幀。使用R中的並行包減少計算時間

我想要做的就是使用該軟件包並行計算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的現有代碼。

謝謝。

+0

這個問題與以前的問題有何不同? – Khashaa

回答

0

你的問題有點開放。 如果您的目標是在多核/處理器上運行代碼,最簡單的解決方案之一是使用並行程序包中的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返回一個列表。