微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

高效处理r中的大空间数据

如何解决高效处理r中的大空间数据

我正在努力在以下代码中进行高效的数据处理。该代码产生了我想要的结果,一个包含两个变量的数据框,但速度非常慢,因为空间数据集非常大,而且我是 R/编程初学者。代码已经运行了大约 5 个小时,并且只循环了 488 个中的大约 80 个。

以下代码旨在确定在 488 个火场中的每一个中被模拟野火横扫的建筑物的最大数量。 Firesheds 是空间上连续的多边形,每个大约 100-300K 英亩。超过 100 万次模拟野火存储在 25 个不同的 shapefile 中,对应于称为火灾发生区 (FOA) 的地理规划单元,平均面积为 4-6 百万英亩。 Firesheds 是小型的社区级多边形,在较大的区域 FOA 中可能有几十个。

我想知道如何改进我的方法以显着减少处理时间。提前致谢!

要使用的数据集

  • Fireshed 是分析单位。有 488 个流域(多边形)*
PRJ <- st_crs(st_read("./Inputs/QWRAOriginal/FOA_perims/Original/foa401rfV3_Perims.shp"))

fshed <- st_read("./Inputs/Firesheds/QWRA_Firesheds.shp") %>% st_transform(crs=PRJ)

这是微软建筑足迹的大型数据集。它是 1.8 GB

MBF_PNW <- st_read("./Inputs/MBF/MBF_PNW.shp") 

模拟火灾存储在与编号火灾发生区 (FOA) 相关联的 25 个独特形状文件中。

FOA_table <- data.frame(FOA=c(401:412,413,414:423),File=list.files("./Inputs/QWRAOriginal/FOA_perims/Original/",pattern = ".shp$",full.names = TRUE))

#These polygons define the FOAs 
Bndry <- st_read("./Inputs/QWRAOriginal/FOA_boundaries.shp")
# empty output for storing loop products
outputs_table <- data.frame(Fireshed_N = NULL,Max_bldgs = NULL)

在以下循环中:对于每个火灾区,确定它相交的任何 FOA 以确定要读取哪些模拟火灾。在大多数情况下,它只会是一个 FOA,但在某些情况下,火灾区可能位于两个或多个 FOA。然后,识别出相关的模拟火灾,找出所有与火场实际相交的火灾,并计算每次火灾与多少建筑物相交。我只关心与单一火灾相交的建筑物的最大数量,然后我将其与火灾区名称一起存储在输出数据框中

for (i in 1:488){
  shp <- fshed[i,] #identify the polygon that represents fireshed 'i'

  foa_int <- Bndry %>% filter(st_intersects(.,shp,sparse=FALSE)) %>% st_drop_geometry() %>% dplyr::select(FOA_number) %>% deframe() 
  
  tbl <- FOA_table %>% filter(FOA %in% c(unique(foa_int)))
  
  for (k in nrow(tbl)){
    fires <- st_read(tbl$File[k]) %>% filter(st_intersects(.,sparse=FALSE)) %>% 
      st_buffer(0) %>% st_set_precision(0.05) %>% st_make_valid() %>%  st_intersection(shp %>% st_make_valid) %>% 
      mutate(bldg_count=lengths(st_intersects(.,MBF_PNW))) %>% st_drop_geometry() 
    
    outputs_table <- rbind(outputs_table,data.frame(Fireshed_N=shp$Frshd_N,Max_bldgs=max(fires$bldg_count))) 
  }
  if(any(i==c(61,122,183,244,305,366,427,488))){
    write.csv(outputs_table,"./Outputs/Fshed_MBF.csv")* periodically save the output*
  }
  cat('Completed Fireshed',i) # add \n to the code
}

解决方法

https://github.com/rstudio/profvis

要使用分析运行代码,请将表达式包装在 profvis() 中。这将导致交互式配置文件可视化器。示例代码:

library(profvis)
library(ggplot2)

p <- profvis({
  g <- ggplot(diamonds,aes(carat,price)) + geom_point(size = 1,alpha = 0.2)
  print(g)
})


# View it with:
p
# or print(p)

我会将 for 循环修改为运行一次并分析该函数以找出瓶颈。 (我猜这将是这个命令 st_intersects(.,MBF_PNW)

你能预先计算任何数据吗?

您能否过滤或子集您的数据,特别是 "./Inputs/MBF/MBF_PNW.shp"。见R/GIS: How to subset a shapefile by a lat-long bounding box?

降低 %>% st_set_precision(0.05) %>% 的精度会减少运行时间吗?

祝你好运!

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?