r - 加速 R 中的 API 调用

标签 r api parallel-processing geturl httr

我正在查询 Freebase 以获取大约 10000 部电影的类型信息。

看完How to optimise scraping with getURL() in R ,我尝试并行执行请求。然而,我失败了——见下文。除了并行化,我还读到 httr可能是 RCurl 的更好选择.

我的问题是:
是否可以通过使用来加速 API 调用
a) 下面循环的并行版本(使用 WINDOWS 机器)?
b) getURL 的替代方法,例如 GEThttr -包裹?

library(RCurl)
library(jsonlite)
library(foreach)
library(doSNOW)

df <- data.frame(film=c("Terminator", "Die Hard", "Philadelphia", "A Perfect World", "The Parade", "ParaNorman", "Passengers", "Pink Cadillac", "Pleasantville", "Police Academy", "The Polar Express", "Platoon"), genre=NA)

f_query_freebase <- function(film.title){

  request <- paste0("https://www.googleapis.com/freebase/v1/search?",
                    "filter=", paste0("(all alias{full}:", "\"", film.title, "\"", " type:\"/film/film\")"),
                    "&indent=TRUE",
                    "&limit=1",
                    "&output=(/film/film/genre)")

  temp <- getURL(URLencode(request), ssl.verifypeer = FALSE)
  data <- fromJSON(temp, simplifyVector=FALSE)
  genre <- paste(sapply(data$result[[1]]$output$`/film/film/genre`[[1]], function(x){as.character(x$name)}), collapse=" | ")
  return(genre)
}


# Non-parallel version
# ----------------------------------

for (i in df$film){
  df$genre[which(df$film==i)] <- f_query_freebase(i)      
}


# Parallel version - Does not work
# ----------------------------------

# Set up parallel computing
cl<-makeCluster(2) 
registerDoSNOW(cl)

foreach(i=df$film) %dopar% {
  df$genre[which(df$film==i)] <- f_query_freebase(i)     
}

stopCluster(cl)

# --> I get the following error:  "Error in { : task 1 failed", further saying that it cannot find the function "getURL". 

最佳答案

这不会在单个 R session 中实现并行请求,但是,它是我用来在多个 R session 中实现 >1 个同时请求(例如并行)的东西,因此它可能很有用。
在高水平
您需要将该过程分成几个部分:

  • 获取您需要进行的 URL/API 调用列表并将其存储为 csv/文本文件
  • 使用下面的代码作为启动多个 R 进程并在它们之间划分工作的模板

  • 注意:这恰好在 Windows 上运行,所以我使用了 powershell。在 mac 上,这可以用 bash 编写。
    Powershell/bash 脚本
    使用单个 powershell 脚本启动多个实例 R 进程(这里我们将工作分配给 3 个进程):
    例如使用 .ps1 保存纯文本文件文件扩展名,您可以双击它来运行它,或者使用任务调度程序/cron 来安排它:
    start powershell { cd C:\Users\Administrator\Desktop; Rscript extract.R 1; TIMEOUT 20000 }
    start powershell { cd C:\Users\Administrator\Desktop; Rscript extract.R 2; TIMEOUT 20000 }
    start powershell { cd C:\Users\Administrator\Desktop; Rscript extract.R 3; TIMEOUT 20000 }
    
    它在做什么?它会:
  • 转到桌面,启动它找到的名为 extract.R 的脚本,并为 R 脚本提供一个参数( 123 )。

  • R进程
    每个 R 进程可以看起来像这样
    # Get command line argument 
    arguments <- commandArgs(trailingOnly = TRUE)
    process_number <- as.numeric(arguments[1])
    
    api_calls <- read.csv("api_calls.csv")
    
    # work out which API calls each R script should make (e.g. 
    indicies <- seq(process_number, nrow(api_calls), 3)
    
    api_calls_for_this_process_only <- api_calls[indicies, ] # this subsets for 1/3 of the API calls
    # (the other two processes will take care of the remaining calls)
    
    # Now, make API calls as usual using rvest/jsonlite or whatever you use for that
    

    关于r - 加速 R 中的 API 调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22986744/

    相关文章:

    go - 在一个goroutine中将项目添加到 channel ,在另一个goroutine中进行处理

    mysql - InfluxDB 在监控中的大量使用

    android - +1 点击在与 Google+ 的 Android 集成中不起作用

    r - 所有数值变量的平均值的组间差异

    r - Dplyr:group_by 并将多列转换为向量

    http - REST API 设计 : Tell the server to "refresh" a set of resources

    linux - 如何衡量一个程序是否在 Linux 中的多个内核上并行运行?

    multithreading - HDF5读取和fit_generator多处理错误

    ios - 在 iOS 设备上显示使用 R 创建的 PDF 图的问题

    r - 使用 dplyr 0.7 和 R 连接到 Microsoft SQL 数据库