Как устранить ошибку: не удается выделить вектор размером 70,7 Гб в RStudio?

Мне нужно преобразовать файл .nc (размер 35 ГБ) в .csv. Он показывает ошибку: невозможно выделить вектор размером 70,7 ГБ.

Как решить эту ошибку?

Я успешно преобразовал файлы .nc (размер 4 КБ) в файлы .csv, используя тот же код, который я использую для преобразования файлов большего размера.

Я попытался очистить память с помощью команды gc() перед командой nc.df.... Кроме того, я попытался увеличить лимит памяти, как показано ниже.

              > memory.limit()
              [1] 16306

              > memory.limit(size = 120000)
              [1] 120000

Код выглядит следующим образом:

   > rm(list = ls())
   > library(raster)
   > nc.brick <- brick(file.choose())
   > nc.df <- as.data.frame(nc.brick, xy=T)
   > write.csv(nc.df, file.choose())

Ожидаемый результат — получить файл .csv с помощью приведенного выше кода. Однако в настоящее время после предпоследней команды (т.е. nc.df ‹- as.data.frame(nc.brick, xy=T) выдается указанная ошибка, т.е. Ошибка: невозможно выделить вектор размером 70,7 Гб.

> sessionInfo()
R version 3.4.0 (2017-04-21)
Platform: x86_64-w64-mingw32/x64 (64-bit)
Running under: Windows >= 8 x64 (build 9200) 

Matrix products: default 

locale: 
[1] LC_COLLATE=English_United States.1252 LC_CTYPE=English_United States.1252 
[3] LC_MONETARY=English_United States.1252 LC_NUMERIC=C 
[5] LC_TIME=English_United States.

1252 attached base packages: 
[1] stats graphics grDevices utils datasets methods base 

other attached packages: 
[1] raster_2.5-8 sp_1.2-4 RevoUtilsMath_10.0.0 

loaded via a namespace (and not attached): 
[1] compiler_3.4.0 RevoUtils_10.0.4 rgdal_1.2-7 tools_3.4.0 Rcpp_0.12.10 ncdf4_1.16
[7] grid_3.4.0 lattice_0.20-35

Я попробовал библиотеку ff, но она снова выдает ту же ошибку.

            > rm(list = ls())
            > library(ff)
            > nc.brick <- brick(file.choose())
            > nc.df <- as.data.frame(nc.brick, xy=T) 

person Olive    schedule 21.10.2019    source источник
comment
Привет, можешь опубликовать результат sessionInfo()?   -  person Biblot    schedule 21.10.2019
comment
Результат @SamuelDiebolt sessionInfo() выглядит следующим образом: Версия R 3.4.0 (21 апреля 2017 г.) Платформа: x86_64-w64-mingw32/x64 (64-разрядная версия) Работает в среде: Windows ›= 8 x64 (сборка 9200) Продукты Matrix : продолжение по умолчанию....   -  person Olive    schedule 21.10.2019
comment
локаль: [1] LC_COLLATE=English_United States.1252 LC_CTYPE=English_United States.1252 [3] LC_MONETARY=English_United States.1252 LC_NUMERIC=C [5] LC_TIME=English_United States.1252 прикрепленные базовые пакеты: [1] графика статистики grDevices использует наборы данных методы основаны на других прикрепленных пакетах: [1] raster_2.5-8 sp_1.2-4 RevoUtilsMath_10.0.0, загруженный через пространство имен (и не прикрепленный): [1]compile_3.4.0 RevoUtils_10.0.4 rgdal_1.2-7 tools_3.4.0 Rcpp_0 .12.10 ncdf4_1.16 продолжение...   -  person Olive    schedule 21.10.2019
comment
[7] сетка_3.4.0 решетка_0.20-35   -  person Olive    schedule 21.10.2019
comment
Поскольку R работает в памяти, достаточно ли у вас доступной оперативной памяти для обработки фрейма данных объемом более 70 ГБ? Вы также можете попробовать использовать библиотеки для обработки больших фреймов данных, например ff.   -  person Biblot    schedule 21.10.2019
comment
У меня нет доступной оперативной памяти для обработки фрейма данных 70 ГБ+. Я попробовал библиотеку (ff), как показано в сообщении, но получил ту же ошибку. Пожалуйста, проверьте пост и дайте мне знать, правильно ли я это сделал.   -  person Olive    schedule 21.10.2019


Ответы (1)


Глядя на ?raster::as.data.frame :

Если памяти недостаточно для загрузки всех значений, вы можете использовать getValues ​​или getValuesBlock для чтения фрагментов файла. Вы также можете сначала использовать sampleRegular

Вы можете использовать getValues или getValuesBlock в цикле для обработки файла по частям (используя append = TRUE в write.csv).

Вы также можете понизить дискретизацию своего растра с помощью sampleRegular, чтобы сделать растр меньше. Только вы можете решить, подходит ли даунсэмплинг в вашем случае.

person asachet    schedule 21.10.2019
comment
После определения nc.brick, как указано выше, я использовал следующий код для подготовки файла nc.df: nc.df ‹- as.data.frame(getValues(nc.brick, 5)[4]). В этом я выбрал 5-ю строку и 4-й столбец. Это дало мне значение, соответствующее соответствующей строке и столбцу. Но в моем выводе я хотел бы иметь все четыре столбца от строки 2 до 5 (т. Е. Строка 2 до 5 и столбец 1 до 4). В таком случае, как мы должны определить строку и столбец в getvalues? - person Olive; 23.10.2019
comment
@Olive Вот что делает getValuesBlock: getValuesBlock(nc.brick, row = 2, nrows = 3, col = 1, ncols = 3). Не на 100% уверен в именах аргументов, но идею вы поняли. - person asachet; 23.10.2019