Сессия R застревает при записи большого массива в файл NetCDF с использованием пакета ncdf4 - PullRequest
0 голосов
/ 24 января 2019

Я читаю большой файл NetCDF (~ 2 ГБ, 72 lon x 36 lat x 100 уровень x 2000 временных ячеек) в RStudio, временно фильтрую его там и пытаюсь записать вывод в новый файл .nc. Однако RStudio застревает при записи выходного файла. Я использую RStudio версии 1.1.456 и R версии 3.5.1 на Mac OSX 10.12.5 (Sierra)

В интерфейсе RStudio я вижу красную кнопку «Стоп» и командную строку без «>», как будто процесс все еще выполняется. Однако, когда я использую Terminal для просмотра запущенных процессов с помощью команды top, я вижу, что «rsession» застрял и использует очень мало CPU-%. Вскоре после начала вычислений CPU-% становится высоким, и rsession работает, но вскоре после этого CPU-% падает, и rsession застревает. Вскоре он выздоровел несколько раз, но всегда снова застревал, в конце концов оставаясь застрявшим. Кроме того, с течением времени он опускается до нижней части «верхнего» списка. Я попробовал тот же код, записывающий вывод в файл .RData, который работал нормально. Поэтому я предполагаю, что с записью вывода .nc должно быть что-то не так (см. Код ниже), иначе R не сможет обработать большой массив для записи в формат .nc. В моем коде ошибка или слишком большой набор данных? Любая помощь будет оценена.

filtered.data.set <- array(NA, dim = c(72,36,100,2000))

# Try to write the output file as .RData file:
# save(filtered.data.set, file = "file_name.RData")
# This works fine.

# Now write the output file as .nc!: -----------

# Define the dimensions to use in the .nc file:
lon.vals <- seq(2.5, 357.5, 5)
lon.dim.nc  <- ncdim_def("Longitude", "Degrees_East", lon.vals)

lat.vals <- seq(-87.5, 87.5, 5)
lat.dim.nc  <- ncdim_def("Latitude", "Degrees_North", lat.vals)

level.vals <- c(1:100)
level.dim.nc <- ncdim_def("Level", "Integer", level.vals)

time.vals <- c(1:2000)
time.dim.nc <- ncdim_def("Time", "Years", time.vals)

my.nc.dims <- list(lon.dim.nc, lat.dim.nc, level.dim.nc, time.dim.nc)

# Define the variable to use in the .nc file:
current.var <- ncvar_def("Temperature", units = "[K]", my.nc.dims, missval = NA, 
longname = "Temperature", prec = "float")

# Create the new file:
current.data.set.nc <- nc_create("file_name.nc", vars = current.var)

# Write the values into the new file:
ncvar_put(nc = current.data.set.nc, varid = "Temperature", vals = filtered.data.set,
        start = c(1,1,1,1), count = c(-1,-1,-1,-1))

# close the variable in R to flush the values into the file:
nc_close(current.data.set.nc)

При завершении R я получаю в результате файл .nc, который частично заполнен соответствующими данными. Таким образом, код, кажется, работает в принципе, но может быть слишком медленным. Могу ли я что-нибудь сделать, чтобы ускорить процесс или, в качестве альтернативы, не дать народу застрять? Еще раз спасибо за любую помощь.

...