我正在AWS EC2实例上运行R脚本。该脚本读入一个物种名称列表,然后确定每个物种的维基百科页面的使用时间(使用rvest
),并检查该页面访问了多少页面(通过{{使用维基百科api) 1}} package),然后再写入磁盘。这是脚本:
pageviews
在注意到我遇到内存问题之后,我修改了代码以便在每个物种之后编写,而不是将所有结果累积到一个大型数据帧中并在最后写出所有内容,但R仍然存在问题。
我运行了一个shell脚本,每十分钟输出f <- read.csv('species.csv', header=F, stringsAsFactors=F)
library(rvest)
library(dplyr)
library(RCurl)
library(pageviews)
for (i in 1:length(f$V1)){
tryCatch({
t <- gsub(' ', '_', f$V1[i])
url <- paste0("http://en.wikipedia.org/wiki/", t)
if (url.exists(url)){
out <- read_html(url) %>%
html_text %>%
nchar
views <- article_pageviews(project='en.wikipedia', article = t)
write.csv(data.frame(species=f$V1[i], size=out, views=views$views), paste0('AllSpecies/', t, '.csv'), row.names=F)
}
cat(paste0(round(i/nrow(f)*100, 4), '%'), Sys.time(), f$V1[i], '\n')
}, error=function(e){cat(f$V1[i], '\n', file='errors.txt', append=T)})
}
的结果,这肯定是一个R进程占用了所有内存。 ps
从大约12%开始,然后每小时增加大约6%,直到系统终止R进程。
这是一种我很少有调试经验的错误。我不确定它是否在我的代码中,或者它可能来自我正在使用的其中一个软件包。
编辑:%MEM
只是一个包含一个字符列的数据框。它有50万行,但这里是f
的输出:
dput(f[1:100, , drop=F])