R在循环中使用xml2包崩溃

R crash using xml2 package in a loop

我有一个包含大约 46000 个链接的目录(我称为 links3),我想使用以下代码抓取每个链接:

library(reshape)
library(plyr)
library(rvest)
library(xml2)

base <- matrix(, nrow = (nrow(links3)), ncol = 19)
basedes <- matrix(, nrow = (nrow(links3)), ncol = 19)
coor <- matrix(, nrow = (nrow(links3)), ncol = 3)


for (i in 1:(nrow(links3))){
x <- links3[i,1]
doc <- read_html(paste0(x))
val <- toString(xml_find_all(doc, xpath="//*[@id='info_nombre']/ul[1]/li[1]/h3/b"))
if(val=="<b>Tipo Inmueble</b>"){
basedes[i,1] <- toString(xml_find_all(doc, xpath="//*[@id='info_nombre']/ul[1]/li[1]/h3/b"))
basedes[i,2] <- toString(xml_find_all(doc, xpath="//*[@id='info_nombre']/ul[1]/li[3]/h3/b"))
basedes[i,3] <- toString(xml_find_all(doc, xpath="//*[@id='info_nombre']/ul[1]/li[5]/h3/b"))
basedes[i,4] <- toString(xml_find_all(doc, xpath="//*[@id='info_nombre']/ul[1]/li[7]/h3/b"))
basedes[i,5] <- toString(xml_find_all(doc, xpath="//*[@id='info_nombre']/ul[1]/li[9]/h3/b"))
basedes[i,6] <- toString(xml_find_all(doc, xpath="//*[@id='info_nombre']/ul[1]/li[11]/h3/b"))
basedes[i,7] <- toString(xml_find_all(doc, xpath="//*[@id='info_nombre']/ul[1]/li[13]/h3/b"))
basedes[i,8] <- toString(xml_find_all(doc, xpath="//*[@id='info_nombre']/ul[1]/li[15]/h3/b"))
basedes[i,9] <- toString(xml_find_all(doc, xpath="//*[@id='info_nombre']/ul[1]/li[17]/h3/b"))
basedes[i,10] <- toString(xml_find_all(doc, xpath="//*[@id='info_nombre']/ul[1]/li[19]/h3/b"))
basedes[i,11] <- toString(xml_find_all(doc, xpath="//*[@id='info_nombre']/ul[1]/li[21]/h3/b"))
basedes[i,12] <- toString(xml_find_all(doc, xpath="//*[@id='info_nombre']/ul[1]/li[23]/h3/b"))
basedes[i,13] <- toString(xml_find_all(doc, xpath="//*[@id='info_nombre']/ul[2]/li[1]/h3/b"))
basedes[i,14] <- toString(xml_find_all(doc, xpath="//*[@id='info_nombre']/ul[2]/li[3]/h3/b"))
basedes[i,15] <- toString(xml_find_all(doc, xpath="//*[@id='info_nombre']/ul[2]/li[5]/h3/b"))
basedes[i,16] <- toString(xml_find_all(doc, xpath="//*[@id='info_nombre']/ul[2]/li[7]/h3/b"))
basedes[i,17] <- toString(xml_find_all(doc, xpath="//*[@id='info_nombre']/ul[2]/li[9]/h3/b"))
basedes[i,18] <- toString(xml_find_all(doc, xpath="//*[@id='info_nombre']/ul[2]/li[11]/h3/b"))

base[i,1] <- toString(xml_find_all(doc, xpath="*//*[@id='info_nombre']/ul[1]/li[2]/h4"))
base[i,2] <- toString(xml_find_all(doc, xpath="//*[@id='info_nombre']/ul[1]/li[4]/h4"))
base[i,3] <- toString(xml_find_all(doc, xpath="//*[@id='info_nombre']/ul[1]/li[6]/h4"))
base[i,4] <- toString(xml_find_all(doc, xpath="//*[@id='info_nombre']/ul[1]/li[8]/h4"))
base[i,5] <- toString(xml_find_all(doc, xpath="//*[@id='info_nombre']/ul[1]/li[10]/h4"))
base[i,6] <- toString(xml_find_all(doc, xpath="//*[@id='info_nombre']/ul[1]/li[12]/h4"))
base[i,7] <- toString(xml_find_all(doc, xpath="//*[@id='info_nombre']/ul[1]/li[14]/h4"))
base[i,8] <- toString(xml_find_all(doc, xpath="//*[@id='info_nombre']/ul[1]/li[16]/h4"))
base[i,9] <- toString(xml_find_all(doc, xpath="//***[@id='info_nombre']/ul[1]/li[18]/h4"))
base[i,10] <- toString(xml_find_all(doc, xpath="//*[@id='info_nombre']/ul[1]/li[20]/h4"))
base[i,11] <- toString(xml_find_all(doc, xpath="//*[@id='info_nombre']/ul[1]/li[22]/h4"))
base[i,12] <- toString(xml_find_all(doc, xpath="//*[@id='info_nombre']/ul[1]/li[24]/h4"))
base[i,13] <- toString(xml_find_all(doc, xpath="//*[@id='info_nombre']/ul[2]/li[2]/h4"))
base[i,14] <- toString(xml_find_all(doc, xpath="//*[@id='info_nombre']/ul[2]/li[4]/h4"))
base[i,15] <- toString(xml_find_all(doc, xpath="//*[@id='info_nombre']/ul[2]/li[6]/h4"))
base[i,16] <- toString(xml_find_all(doc, xpath="//*[@id='info_nombre']/ul[2]/li[8]/h4"))
base[i,17] <- toString(xml_find_all(doc, xpath="//*[@id='info_nombre']/ul[2]/li[10]/h4"))
base[i,18] <- toString(xml_find_all(doc, xpath="//*[@id='info_nombre']/ul[2]/li[12]/h4"))


lon <- toString(xml_find_all(doc, xpath="*//input[@type='hidden']"))
lon <- gsub(".*longitud", "", lon)
lon <- gsub("/>.*", "", lon)
lon <- gsub("value=", "", lon)
lon <- gsub("\"", "", lon)
lon <- gsub(" ", "", lon)
coor[i,1] <- lon

lat <- toString(xml_find_all(doc, xpath="*//input[@type='hidden']"))
lat <- gsub(".*latitud", "", lat)
lat <- gsub("/>.*", "", lat)
lat <- gsub("value=", "", lat)
lat <- gsub("\"", "", lat)
lat <- gsub(" ", "", lat)
coor[i,2] <- lat

cod<-  toString(xml_find_all(doc, xpath="*//div[@class='code']"))
cod <- gsub(".*web: ", "", cod)
cod <- gsub("<.*", "", cod)
coor[i,3] <- cod
remove(val)
remove(lat)
remove(lon)
}else{}
}

但在大约 5000 次迭代后,我收到以下消息:

r for windows gui frontend stopped working 

我必须关闭 R 会话并重新开始。

我查看了我的系统配置,它显示如下:

Processes: 93;
CPU Usage 6%;
Physical Memory: 51%;
RAM:8.0 GB;
Windows 7;

为什么我会收到这条消息?我该如何解决?

根据您在此处提供的数据和代码,还不能 100% 清楚问题出在哪里。但是,当您创建大量变量时。每个变量都存在于您的 RAM 中的活动内存中。

尽管配置为 51%,但取决于您的系统,是否有任何 java 包在运行以及您使用垃圾回收,您可能 运行 可用内存不足可供 R 及其子进程使用。

如果是我遇到了这个问题,并且我确定源代码没有让我崩溃(通过转到实际的迭代,它直接崩溃并一次检查一个错误或错误数据)或者脚本有一个错误,我会看看我的数据需求是什么,创建的哪些变量需要在下一步中保留,哪些不需要。

然后我会积极地使用 rm()gc() 来删除和垃圾收集以清除垃圾,看看下次它是否更进一步。您可能需要在 INSIDE 循环中的几个步骤中执行此操作,以移除无法自行清除的副产品。

如果您不能清除任何获取的数据,那么我仍然会使用 rm()gc() 来删除一些需要的数据,只是为了看它是否继续通过整个循环。如果是这样,那么您就知道这实际上是一个内存管理问题。

现在需要编写一个脚本来收集成串的数据,将其转换为最紧凑的格式并将其存储在持久内存中,直到完成所有处理,然后将其加载到 RAM 中供您分析。您可以使用 csv 或 json 文件。

R 是一种非常强大的语言,在许多情况下都能很好地工作,但要求您在数据变大时很好地管理临时数据和变量。一个简单的 table 可能会持续存在多达 4 个实例,具体取决于它的操作和管理方式。因此,如果您有一个正常运行的脚本,那么您将需要研究如何管理从该脚本中获得的内容并将其带回分析过程。

对我来说,我倾向于处理大文件,就像我一次吃一整头牛一样。根据需要插入静态内存以获取值,并随时更新静态文件。

希望对您有所帮助。