我處理大型全球降水數據集(很細的空間分辨率)來計算使用的R.優化/並行化的R - 處理大型數據集R中計算SPI
SPEI package我的標準化降水指數通常我的問題是指使用非常大的數據優化數據處理。我在其他帖子中發現了一些討論(here,here和here fo實例),但沒有一個與我的情況類似。
我的輸入是一個包含超過20年每月觀測值(> 20 * 12行)降水時間序列的矩陣,其中> 1,000,000點(列)。 SPI的計算爲每個時間序列執行一系列步驟,並將該指數計算爲中值的標準偏差。 輸出是一個列表,結果矩陣($擬合)具有相同大小的輸入矩陣。
下面的代碼示例:
require(SPEI)
#generating a random values matrix
data<-replicate(200, rnorm(240))
# erasing negative values
data[data<=0]=0
spi6 <- spi(data, 6, kernel = list(type = 'rectangular', shift = 0), distribution = 'PearsonIII', fit = 'ub-pwm', na.rm = FALSE, ref.start=NULL, ref.end=NULL, x=FALSE, params=NULL)
#testing the results
plot(spi6$fitted[,67])
#taking my results out
results <- t(spi6$fitted)
這個腳本作品完美,但如果我增加點(在這種情況下,列)成倍的處理時間增加而增加。直到達到內存不足的問題:
Warning messages:
1: In std[ff, s] <- qnorm(cdfpe3(acu.pred[ff], p3par)) :
Reached total allocation of 16253Mb: see help(memory.size)
2: In std[ff, s] <- qnorm(cdfpe3(acu.pred[ff], p3par)) :
Reached total allocation of 16253Mb: see help(memory.size)
3: In NextMethod("[<-") :
Reached total allocation of 16253Mb: see help(memory.size)
4: In NextMethod("[<-") :
Reached total allocation of 16253Mb: see help(memory.size)
5: In std[ff, s] <- qnorm(pze + (1 - pze) * pnorm(std[ff, s])) :
Reached total allocation of 16253Mb: see help(memory.size)
6: In std[ff, s] <- qnorm(pze + (1 - pze) * pnorm(std[ff, s])) :
Reached total allocation of 16253Mb: see help(memory.size)
7: In NextMethod("[<-") :
Reached total allocation of 16253Mb: see help(memory.size)
8: In NextMethod("[<-") :
Reached total allocation of 16253Mb: see help(memory.size)
如何可以分割我的輸入矩陣(或分割在輸入矩陣的步驟),以列向量的並行處理組(它們中的每一個完整的時間序列的一個特定的點),而不會丟失信息(或弄亂我的數據)? 謝謝。
謝謝聖地亞哥。並行解決方案(最後一個)大大加快了進程速度,但仍會產生內存問題。使用apply的人工作得很好。 – Nemesi
你是對的,paralellizing不解決內存問題。我編輯我的答案以反映這一點。 –