调用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
相关产品推荐
相关产品推荐

