R исчерпывает память, отображая фрейм данных с ggplot2 - PullRequest
0 голосов
/ 01 мая 2020

Я использую R на Fedora 31 на ноутбуке Dell XPS с 8 ГБ ОЗУ. Я пытаюсь построить этот GeoTIFF , используя ggplot2, чтобы я мог наложить другие данные, используя код, который я уже написал с помощью ggplot2. Я примерно следовал этому уроку по работе с растровыми данными в R. После преобразования TIFF в RasterLayer во фрейм данных программа R завершается неудачно при загрузке фрейма данных с помощью ggplot2, просто выводя "Killed "и выход.

Вот минимальный пример кода, который выдает эту ошибку:

library(tidyverse)
library(raster)
library(rgdal)

afg_pop <- raster("afg_ppp_2020.tif")
pop_df <- as.data.frame(afg_pop, xy = TRUE)

ggplot() +
    # This is the line that results with the error: "Killed"
    geom_raster(data = pop_df , aes(x = x, y = y, fill = afg_ppp_2020))

Запуск dmesg показывает, что R исчерпал память:

 [20563.603882] Out of memory: Killed process 42316 (R) total-vm:11845908kB, anon-rss:6878420kB, file-rss:4kB, shmem-rss:0kB, UID:1000 pgtables:19984kB oom_score_adj:0

Мне трудно поверить, что даже с файлом данных у этого большого R не хватает памяти, необходимой для его обработки. Почему R требуется так много памяти для выполнения этой задачи и, что более важно, какой другой метод я могу использовать для построения этих данных, предпочтительно используя ggplot2?

Я относительно новичок в R, поэтому, пожалуйста, прости меня, если я Я игнорирую что-то очевидное здесь. Любая помощь будет оценена!

1 Ответ

1 голос
/ 01 мая 2020

Я не могу говорить о требованиях к памяти ggplot, но пространственное разрешение данных очень высокое (~ 90 м). Нет смысла просить ggplot нарисовать 10955 (строки) * 17267 (столбцы) = 189 159 985 пикселей, поскольку вы не сможете их увидеть (если, возможно, вы не печатаете рекламный щит). Таким образом, простой обходной путь - взять обычную выборку или собрать

f <- "ftp://ftp.worldpop.org.uk/GIS/Population/Global_2000_2020/2020/AFG/afg_ppp_2020.tif"
if (!file.exists(basename(f))) download.file(f, basename(f), mode="wb")

library(raster)
afg_pop <- raster("afg_ppp_2020.tif")
pop_df <- data.frame(sampleRegular(afg_pop, 10000, xy=TRUE))

library(ggplot2)
ggplot() + geom_raster(data = pop_df , aes(x = x, y = y, fill = afg_ppp_2020))

Лучшая альтернатива, которая занимает немного больше времени

afg_pop2 <- aggregate(afg_pop, 10) # this takes some time
pop_df2 <- as.data.frame(afg_pop2, xy=TRUE)
ggplot() + geom_raster(data = pop_df2 , aes(x = x, y = y, fill = afg_ppp_2020))

Карты не очень хороши; в других пакетах R есть лучшие варианты для создания карт.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...