Ошибка Segfault при использовании пакета gDistance R в кластере HPC - PullRequest
0 голосов
/ 03 декабря 2018

Я пытаюсь вычислить расстояние (через пакет gdistance R) для ~ 900 растровых изображений с помощью кластерного компьютера.Мой сценарий будет выполнять итерацию примерно трех изображений и впоследствии завершится с ошибкой примерно через час со следующей ошибкой:

*** caught segfault *** address 0x2ab1a25456cc, cause 'memory not mapped'

Кажется, что сбой происходит, когда вводится большое растровое изображение: третье изображение в наборе данных91000 КБ, тогда как первое и второе изображения составляют 44 КБ и 18 КБ соответственно.Работа кластера использует 64 ГБ памяти, с 10 ядрами и большим количеством настенного времени.

Мой код R выглядит так:

library(gdistance)
library(stringr)
library(data.table)
setwd("H:/GIS_Isolation/Isolation_by_Resistance/NetworkX/Dataset/Rasters/Compiled_Rasters")
rasterList = list.files(pattern = 'FID(.*).asc')

coordTable <- read.delim2(file = 'H:/IAS Data/Island IsolationIndex/ResistanceDistanceCalcs/Island_CoordTable_Complete.txt',header= TRUE, sep = ",")

cdTable <- data.frame(FID = integer(), Name = character(), resDist = double(), stringsAsFactors = FALSE)

# iterate through each raster in the dataset
for (raster in rasterList){

#setup specific raster for analysis and extract important metadata
print(raster)
FID <- str_extract(raster, pattern =("(?<=FID).*(?=.asc)"))
print(FID)
r <- raster(x = raster, package = "gdistance")
crs(r) <- "+proj=tmerc +lat_0=0 +lon_0=173 +k=0.9996 +x_0=1600000 +y_0=10000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m"
r_proj <- projectRaster(r, crs = '+proj=longlat +datum=WGS84 + zone=60')

#extract specific raster source/dest coords from coordTable
filterTable <- subset.data.frame(coordTable, FID_Unique == FID)
name <- toString(filterTable[1,4])
sourceX <- toString(filterTable[1,2])
sourceX <- as.numeric(sourceX)
sourceY <- toString(filterTable[1,3])
sourceY <- as.numeric(sourceY)
destX <-toString(filterTable[1,7])
destX <-as.numeric(destX)
destY <-toString(filterTable[1,8])
destY <-as.numeric(destY)
startPt <- c(sourceX, sourceY)
finishPt <- c(destX, destY)
sp <- rbind(startPt, finishPt) #commute distance function takes both coordinate points as single input
print(sp)

#establish transition function: defines movement through landscape
#use the reciprocal of mean to model landscape permeability (as opposed to friction)
#cells connected to eight nearest orthogonal and diagonal neigbors, common for macro-biological systems
tr <- transition(r_proj, transitionFunction = function(x) 1/mean(x), directions = 8)

#commute distance
cd <- commuteDistance(tr, sp)
cd <- toString(cd)
print(cd)

#append data to dataframe
cdTable[nrow(cdTable)+1, ] <- c(FID, name, cd)
}

write.csv(cdTable, file = "CommuteDistance_Complete.csv")

Я считаю, что проблема может быть связана с gdistanceпакет, потому что ошибка всегда терпит неудачу, как только функция перехода введена.Я также обновил gdistance до последней версии в кластере.Я довольно новичок в кластерных вычислениях, поэтому любые мысли или рекомендации будут с благодарностью!

...