Как эффективно распараллелить функцию EXTRACT в растровом пакете R - PullRequest
0 голосов
/ 24 сентября 2018

Учитывая файл netcdf, я пытаюсь извлечь все пиксели, чтобы сформировать data.frame для последующего экспорта в .csv

a=brick(mew.nc)
#get coordinates 
coord<-xyFromCell(a,1:ncell(a))

Я могу извлечь данные для всех пикселей, используя extract(a,1:ncell(a)).Однако у меня возникают проблемы с памятью.

Прочитав различные страницы справки, я обнаружил, что можно ускорить процесс с помощью:

beginCluster(n=30)
b=extract(a, coord)
endCluster()

Но у меня все еще не хватает памяти.Наш суперкомпьютер содержит более 1000 nodes, each node has 32 cores.

Мой фактический растровый кирпич имеет 400 000 слоев

Я не уверен, как выполнить эту задачу, не сталкиваясь с проблемами с памятью.

Спасибо за все ваши предложения.

Примерные данные размером ~ 8 МБ можно найти здесь

1 Ответ

0 голосов
/ 24 сентября 2018

Вы можете сделать что-то в этом направлении, чтобы избежать проблем с памятью

library(raster)
b <- brick(system.file("external/rlogo.grd", package="raster")) 

outfile <- 'out.csv'
if (file.exists(outfile)) file.remove(outfile)

tr <- blockSize(b)
b <- readStart(b)
for (i in 1:tr$n) {
    v <- getValues(b, row=tr$row[i], nrows=tr$nrows[i])
    write.table(v, outfile, sep = ",", row.names = FALSE, append = TRUE, col.names=!file.exists(outfile))
}
b <- readStop(b)

Чтобы распараллелить, вы можете сделать это по слою или группам слоев;и, вероятно, все значения за один шаг для каждого подмножества слоев.Здесь для одного слоя за раз:

f <- function(d) {
   filename <- extension(paste(names(d), collapse='-'), '.csv')
   x <- values(d)
   x <- matrix(x) # these two lines only needed when using
   colnames(x) <- names(d)  # a single layer
   write.csv(x, filename, row.names=FALSE)
}

# parallelize this:
for (i in 1:nlayers(b)) {
    f(b[[i]])
}

или

x <- sapply(1:nlayers(b), function(i) f(b[[i]]))

Вы должны не использовать extract.У меня вопрос, для чего вам нужен такой большой CSV-файл.

...