我正在抓一个网站,并从for-loop调用我的抓取功能.在循环的4,000次迭代中,我的计算机警告我RStudio使用了太多的内存.但是在使用转义键断开循环之后,我在R环境中看不到任何大对象.
我尝试了这两个 帖子的提示,但他们没有透露原因.当我mem_used()从pryr包裹打电话时,我得到:
2.3 GB
这与Windows任务管理员最初所说的一致.它表示2.3 GB,然后在循环结束后十分钟内降至1.7 GB,在循环后二十分钟内降至1.2 GB.  mem_used()继续说2.3 GB.
但根据lsos()上面链接的第一篇文章中的函数,我的R对象很小:
> lsos()
                       Type     Size  Rows Columns
all_raw              tbl_df 17390736 89485      12
all_clean            tbl_df 14693336 89485      15
all_no_PAVs          tbl_df 14180576 86050      15
all_no_dupe_names    tbl_df 13346256 79646      15
sample_in            tbl_df  1917128  9240      15
testdat              tbl_df  1188152  5402      15
username_res         tbl_df   792936  4091      14
getUserName        function   151992    NA      NA
dupe_names           tbl_df   132040  2802       3
time_per_iteration  numeric    65408  4073      NA
这说我最大的对象是17 MB,不接近2.3 GB.我怎样才能找到内存使用的罪魁祸首并修复它?循环中是否存在逐渐占用内存的东西?
这是一个可重现的测试示例,抓取IMDB.com:
library(rvest) # rvest 0.2.0 needed to produce the error, it was fixed in 0.3.0
library(stringr)
library(dplyr)
search_list <- make.names(names(precip))
scrape_top_titles <- function(search_string) {
  urlToGet <- paste0("http://www.imdb.com/find?q=", search_string)
  print(urlToGet)
  page <- html(urlToGet)
  top_3_hits <- page %>%
    html_nodes(xpath='//td[contains(@class, "result_text")]') %>%
    html_text %>%
    str_trim %>%
    .[1:3]
  result <- list(search_term = search_string, hit_1 = top_3_hits[1], hit_2 = top_3_hits[2], hit_3 = top_3_hits[3], page_length = nchar(page %>% html_text))
result
}
# These 70 scrapes will start filling memory
scrapes <- bind_rows(
  lapply(search_list, function(x) {data.frame(scrape_top_titles(x), stringsAsFactors = FALSE)})
)
# For more dramatic memory filling, scrape 770 pages instead
longer_list <- as.vector(outer(search_list, names(mtcars), paste, sep="_"))
long_scrapes <- bind_rows(
  lapply(longer_list, function(x) {data.frame(scrape_top_titles(x), stringsAsFactors = FALSE)})
) 
更新:看起来它是由rvest调用的XML包中的内存泄漏,类似于此问题中描述的内容,并在另一个问题中显示.rvest的0.3.0版本调用了xml2包并解决了这个内存泄漏问题,因此除非使用旧版本的rvest,否则上述代码不再生成错误.
我仍然在寻找能够完全描述这里发生了什么的答案:任何人都可以解释"内存泄漏"吗?问题已得到解决,但我对发生的事情感到好奇.
| 归档时间: | 
 | 
| 查看次数: | 395 次 | 
| 最近记录: |