Растеризация и мозаика большого (~15GB) CSV параллельно

Я пытаюсь растеризовать большой CSV-файл, который содержит координаты X и Y растровых пикселей и идентификатор, представляющий разных людей, которые прошли через пиксель.

Я хочу, чтобы в этой операции было 2 растра: во-первых, каждый пиксель растра содержит количество раз, когда люди пересекли его, а во-вторых, каждый пиксель содержит количество уникальных людей, которые его пересекли.

В настоящее время я создаю растры для каждого идентификатора, а затем создаю мозаику для растров. Я распараллелил эту операцию, используя 16 ядер и процессор с 200 ГБ оперативной памяти. Однако CSV содержит более миллиона строк, и кажется, что копирование его в каждое ядро ​​требует больших затрат. Это также занимает более 4 дней, и у меня есть несколько таких файлов CSV.

Есть ли лучший, более быстрый способ сделать это?

Это то, что я делаю в настоящее время:

n.cores <- 16 #this is half of the available cores

#Register CoreCluster
cl       <- makeCluster(n.cores)
registerDoSNOW(cl)

clusterExport(cl=cl, "fil2" ) #fil2 is the CSV


#uq_id is a vector of all unique IDs
 rasterList= foreach(i=1:length(uq_id), .combine='comb', 
            .init=list()) %dopar% {

  library(raster)

 #create a raster for each unique ID 
  dfXYID <- subset(fil2, uqid %in% i)
  dfXYID$uqid <- as.numeric(dfXYID$uqid)
  dfXYID=as.data.frame(dfXYID)

  x <- raster(xmn=min(dfXYID$V1), xmx=max(dfXYID$V1), ymn=min(dfXYID$V2), ymx=max(dfXYID$V2), res=220, crs="+proj=utm +zone=43 +datum=WGS84 +units=m +no_defs")

#create a raster of the number of times individual with ID i have moved through a pixel 
lenList <- rasterize(dfXYID[, c('V1', 'V2')], x, dfXYID[, 'uqid'], fun=function(x,...){length((na.omit(x)))})


  return(lenList)

}

В этом случае rasterList представляет собой список растров, каждый из которых представляет движение отдельного пользователя i. Затем мне нужно выполнить еще одну трудоемкую операцию (могу ли я сделать это параллельно в вышеупомянутом foreach?): Применить операцию мозаики к этому большому списку, чтобы получить 2 растровых выхода, которые мне нужны.

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

Я понимаю, что gdal - это вариант, но я вынужден работать с CSV, и я не хочу писать каждый растр в rasterList на диск для дальнейшей обработки с помощью gdal.

0 ответов

Другие вопросы по тегам