当前位置: 首页 > 知识库问答 >
问题:

如何使用rowwise进行并行处理

曹泉
2023-03-14

我正在使用rowwise在每一行上执行一个函数,这需要很长时间,为了加快速度,有没有一种方法可以使用并行处理,使多个核心在不同的行上并发工作?

例如,我将PRISM天气数据(https://prism.oregonstate.edu/)聚合到州一级,同时按人口加权。这是基于https://www.patrickbaylis.com/blog/2021-08-15-pop-weighted-weather/.

请注意,下面的代码需要下载每日天气数据,以及在非常小的地理位置下载带有人口估计的shapefile。

library(prism)
library(tidyverse) 
library(sf)
library(exactextractr)
library(tigris)
library(terra)
library(raster)
library(ggthemes)

################################################################################
#get daily PRISM data
prism_set_dl_dir("/prism/daily/")
get_prism_dailys(type = "tmean", minDate = "2012-01-01", maxDate = "2021-07-31", keepZip=FALSE) 

Get states shape file and limit to lower 48    
states = tigris::states(cb = TRUE, resolution = "20m") %>%
    filter(!NAME %in% c("Alaska", "Hawaii", "Puerto Rico"))

setwd("/prism/daily")

################################################################################
#get list of files in the directory, and extract date
##see if it is stable (TRUE) or provisional data (FALSE)
list <- ls_prism_data(name=TRUE) %>% mutate(date1=substr(files, nchar(files)-11, nchar(files)-4), 
            date2=substr(product_name, 1, 11),
            year = substr(date2, 8, 11), month=substr(date2, 1, 3), 
            month2=substr(date1, 5, 6), day=substr(date2, 5, 6),
            stable = str_detect(files, "stable"))

################################################################################
#function to get population weighted weather by state

#run the population raster outside of the loop
# SOURCE: https://sedac.ciesin.columbia.edu/data/set/usgrid-summary-file1-2000/data-download - Census 2000, population counts for continental US
pop_rast = raster("/population/usgrid_data_2000/geotiff/uspop00.tif")
pop_crop = crop(pop_rast, states)

states = tigris::states(cb = TRUE, resolution = "20m") %>%
    filter(!NAME %in% c("Alaska", "Hawaii", "Puerto Rico"))

daily_weather <- function(varname, filename, date) {
    weather_rast = raster(paste0(filename, "/", filename, ".bil"))
    
    weather_crop = crop(weather_rast, states)
    
    pop_rs = raster::resample(pop_crop, weather_crop)
    
    states$value <- exact_extract(weather_crop, states, fun = "weighted_mean", weights=pop_rs)
    names(states)[11] <- varname
    
    states <- data.frame(states) %>% arrange(NAME) %>% dplyr::select(c(6,11))
    states
}

################################################################################
days <- list %>% rowwise() %>% mutate(states = list(daily_weather("tmean", files, date1))))

事实上,每行大约需要7秒。这加起来有3500行。我想在tmeans之外得到其他变量。所以除非我能加快速度,否则做每件事都需要一天或更长时间。

我主要感兴趣的解决方案是能够使用并行处理与行,但我也欢迎其他建议如何加快代码在其他方面。

共有1个答案

公西志文
2023-03-14

您可以尝试使用它的多处理等效的burrr(或者map()或者pmap())。最快的方法是使用data.table。请参阅这篇博客文章,其中给出了我建议背后的一些基准

 类似资料:
  • 我的Spring批处理作业每3分钟运行一次。 步骤应为 每个用户的记录应该并行执行。每个用户最多可以有150k条记录。 每个用户都可以有更新和删除记录。更新记录应在删除之前运行。 更新/删除集应该自己并行运行。但严格来说,所有更新都应该在删除之前完成。 有谁能提出在多个级别实现并行性的最佳方法,并遵循更新和删除级别的顺序吗。我正在研究Spring异步执行器服务、并行流和其他Spring库。Rx,仅

  • 我正试图用CakePHP3制作一个api。有了这个api,我将向系统发送一些批量电子邮件的信息。在将api请求存储到databse中之后,我希望返回已收到请求的确认并开始批处理。完成处理后,我想发送一个回调响应来返回处理状态。在我目前的编码系统中,我必须等待完成这个过程。我怎么能并行地做呢? [我不确定实际问题的标题应该是什么,请随意编辑。:)]

  • 我附上了一个应用程序的示例代码,它在我的Core i3 370M笔记本电脑上(Win 7 64bit,Java 1.8.0.4564bit)在大约20秒内重现了这个问题。这个应用程序读取识别文本蕴涵(RTE)语料库的XML文件,然后使用标准Java并发类同时解析所有句子。本地RTE XML文件的路径需要作为命令行参数给出。在我的测试中,我使用了以下公开的XML文件:http://www.nist.

  • 我正试图弄清楚如何使用Spring Batch进行聚合。例如,我有一个带有姓名列表的CSV文件: 我想要文本文件中的姓名计数: 根据我从Spring Batch中学到的,ETL批处理过程(itemReader- Spring Batch是正确的工具吗?还是我应该用Spark?谢谢

  • 问题内容: 我有一个测试,可以从数据提供者那里接收数据。我希望此测试与数据提供者的不同值并行运行。 我尝试了类似的方法: } 我收到的输出是: 你好:10 你好:12 你好:17 你好:11 你好:16 你好:14 你好:13 你好:15 产生10个线程,而我在线程池大小中指定5个。您能否告诉我们必须在上述代码段中添加哪些内容来控制数据提供程序线程池的大小。 问题答案: 您需要使用。在和不需要的值

  • 问题内容: 我想知道如何使用MyBatis 3和Spring 3通过我的插入语句实现批处理操作? 例如,这是当前正在执行的操作: spring.xml: MyService.xml: MyService.java: MyController.java: 免责声明:这只是用于演示目的的伪代码 那么我该怎么做才能将其变成批处理流程呢? 理想情况下,我希望能够以最少的“侵入”代码来做到这一点,即更优先使