You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

调用UN Comtrade API时R会话无报错崩溃求助

UN Comtrade批量拉取数据时R会话无报错中止问题

问题背景

我用R编写了从UN Comtrade获取贸易数据的代码,核心是定义get.Comtrade函数拼接API请求URL,通过download.file下载数据文件,读取后合并到全局变量output_df中。外层通过嵌套循环遍历报告国列表、伙伴国列表,结合时间区间列表批量调用该函数。

代码逻辑为:每组不超过5个报告国和伙伴国,调用UN Comtrade API拉取指定时间区间的进出口贸易数据并保存至临时目录。部分报告国/伙伴国组合运行正常,但遍历所有报告国+单个伙伴国的组合时,R会话直接无报错中止,命令行运行也出现同样问题。

相关代码

get.Comtrade <- function(url="http://comtrade.un.org/api/get?"
                         ,maxrec=1000000
                         ,type="C"
                         ,freq="A"
                         ,px="HS"
                         ,ps="now"
                         ,r
                         ,p
                         ,rg="all"
                         ,cc="TOTAL"
                         ,fmt="json"
)
{
  string<- paste(url
                 ,"max=",maxrec,"&" # 最大返回记录数
                 ,"type=",type,"&" # 贸易类型(C=商品)
                 ,"freq=",freq,"&" # 统计频率
                 ,"px=",px,"&" # 商品分类标准
                 ,"ps=",ps,"&" # 时间区间
                 ,"r=",r,"&" # 报告国
                 ,"p=",p,"&" # 伙伴国
                 ,"rg=",rg,"&" # 贸易流向
                 ,"cc=",cc,"&" # 分类代码
                 ,"fmt=",fmt        # 返回格式
                 ,sep = ""
  )
  filename <- paste0("temp/",r,p,ps,cc, ".csv") %>% str_replace_all(",", "")
  retry(download.file(string, filename, method = "wininet"), maxErrors = 5, sleep = 20)
  df <- read_csv(filename) %>%
    mutate_all(as.character, show_col_types = FALSE)
  output_df <<- df %>% bind_rows(output_df)
}


for(r in reporter_list){
  print(r)
  for(p in partner_list){
    print(p)
    rl <<- paste(r, collapse = ',')
    pl <<- paste(p, collapse = ',')
    as.list(interval_list) %>% map(~get.Comtrade(r=rl, p=pl, fmt = "csv", freq = "m", cc = "AG4", rg =regime, ps = .x))
    print("after map!")
  }
}

排查方向参考

  • 内存溢出:遍历所有报告国时,单批次拉取数据量过大,output_df持续累加导致内存耗尽。可尝试:
    • 每次调用后将数据写入本地文件而非存在全局变量,最后再合并
    • 定期调用gc()清理内存,增加内存监控
  • API隐性限制:UN Comtrade存在请求频率或单请求数据量限制,大量报告国组合可能触发限制导致连接中断。可尝试:
    • 在map中加入请求间隔(如Sys.sleep(5))
    • 拆分报告国列表,每次仅拉取更少国家
  • 文件读写异常:临时目录temp/是否存在?部分组合生成的文件名过长或含特殊字符,可能导致读写失败。可检查文件名生成逻辑,规避非法字符
  • 重试逻辑资源泄漏:retry包裹download.file时,多次失败重试可能引发资源泄漏,建议在重试失败后捕获错误并跳过该组合

内容的提问来源于stack exchange,提问作者entropy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 21:15:34