2016-11-15 70 views
0

我有一個非常大的數據集,並希望進行一些統計分析。計算只需要一行代碼,但可能需要幾天時間。有什麼方法可以加速這個過程嗎?如何加快R中單行代碼的計算速度?

起初,我認爲並行化可能是一個很好的解決方案,但後來有人告訴我,單個調用的並行化是不可能的。下面是一個例子,

set.seed(1234) 
mydata=rnorm(5000*150) 
mydata=matrix(mydata,ncol=150) 

library(parallel) 
cl.cores <- detectCores() 
cl <- makeCluster(cl.cores) 
clusterSetRNGStream(cl,iseed=1234) 
clusterExport(cl,"mydata") 
clusterEvalQ(cl,library(NbClust)) 
nc = clusterApply(cl,2,function(min.nc) fun=NbClust(mydata,min.nc=min.nc,max.nc = 8,method = "kmeans")) 
stopCluster(cl) 

對於這個例子,在桌面的CPU佔用保持在30%左右,這是正常的值的速度沒有增加。

+0

謝謝您的建議。 –

+0

是的,更適合SO。 – wrtsvkrfm

+0

您可以嘗試優化並行化。也許負載平衡可能會有所幫助,也許你應該立即將矩陣塊發送到節點。否則,你可以考慮使用編譯代碼,例如,在Rcpp中實現。但首先你應該考慮你在那裏做什麼是明智的。如果某些事情需要數天計算,那麼應該花一些時間重新考慮算法。 – Roland

回答

1

您需要獲取NbClust的源代碼,然後優化此功能。

例如,您可以嘗試將冗餘計算移出此方法(只需執行一次)。

如果函數仍然是R代碼,請用C++重寫它(即Rcpp)。這將大大加快功能,因爲純粹的R代碼非常慢。