【问题标题】:R runs out of memory plotting data frame with ggplot2R用ggplot2绘制数据框内存不足
【发布时间】:2020-05-01 01:12:46
【问题描述】:

我在配备 8Gb RAM 的戴尔 XPS 笔记本电脑上的 Fedora 31 上运行 R。我正在尝试使用 ggplot2 绘制 this GeoTIFF,以便我可以使用我已经用 ggplot2 编写的代码覆盖其他数据。我一直在大致关注this lesson 在 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 比较陌生,所以如果我在这里忽略了一些明显的东西,请原谅我。任何帮助将不胜感激!

【问题讨论】:

    标签: r linux ggplot2 r-raster


    【解决方案1】:

    我无法谈论ggplot 的内存要求,但数据的空间分辨率非常高(~ 90m)。要求 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 包中有更好的选项来制作地图。

    【讨论】:

    • 谢谢罗伯特,这对我很有效。我会对其他哪些软件包更适合制作这样的地图感兴趣;我的印象是 ggplot 是这种分层 GIS 工作的不错选择。
    猜你喜欢
    • 2018-04-08
    • 2021-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-26
    • 1970-01-01
    相关资源
    最近更新 更多