2016-07-10 4 views
-1

Ich habe ein Verzeichnis mit ca. 46.000 Verbindungen (I genannt links3) und ich möchte, dass jeder von ihnen mit dem folgenden Code kratzen:R Crash mit xml2 Paket in einer Schleife

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{} 
} 

Aber nach etwa 5000 Iterationen I die folgende Nachricht erhalten:

r for windows gui frontend stopped working 

Ich muss R Sitzung schließen und neu starten.

Ich habe meine Systemkonfiguration geschaut und es zeigt folgendes:

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

Warum ich diese Meldung habe? Wie kann ich es lösen?

+0

Können Sie es einfach in der Befehlszeile ausführen? Ich habe den gesamten Code nicht gelesen, aber gibt es irgendwelche Pop-Ups oder Graphen oder ähnliches an irgendeinem Punkt? Wenn ja, deaktiviere sie. Wenn nicht, von der Befehlszeile ausführen. –

+0

Eigentlich habe ich den Code mit a ausgeführt.bat file in verschiedene Computer: "C: \ Programme \ R \ R-3.2.2 \ bin \ x64 \ R.exe" CMD BATCH "~ \ script.R" auch mit R Studio und ich habe das gleiche Problem. Meine R-Version ist: R-3.2.2 – Arlet

+0

Nun, für den Anfang würde ich 'toString()' vermeiden und es gibt eine wesentlich bessere Möglichkeit, um zu den Daten zu gelangen, aber wir haben keine Ahnung, was Ihre Daten tatsächlich sind, seit Sie didn Ich gebe es nicht. – hrbrmstr

Antwort

0

Es ist nicht 100% klar von den Daten und Code, den Sie hier angegeben haben, was das Problem ist. Wenn Sie jedoch viele Variablen erstellen. Jede Variable lebt im aktiven Speicher in Ihrem RAM.

Und trotz der Konfiguration bei 51%, abhängig von Ihrem System, ob es irgendwelche Java-Pakete im Spiel gibt und Sie Garbage Collection verwenden, könnte Ihnen der für R und seine Unterprozesse verfügbare nutzbare RAM ausgehen.

Wenn ich dieses Problem hatte und ich war mir sicher, dass die Quelle mich nicht stürzte (indem ich zu den tatsächlichen Iterationen ging, stürzte es direkt ab und prüfte nacheinander nach Fehlern oder schlechten Daten) oder dass das Skript a hatte Fehler darin, ich würde mir ansehen, was meine Daten brauchen, welche der erzeugten Variablen für den nächsten Schritt bestehen bleiben müssen und welche nicht.

Dann würde ich aggressiv verwenden rm() und gc() zu entfernen und Müll zu sammeln, um die Gruft zu löschen und sehen, ob es das nächste Mal weiter geht. Möglicherweise müssen Sie dies in ein paar Schritten tun INSIDE Ihre Schleife, um Nebenprodukte zu entfernen, die sich nicht selbst löschen.

Wenn Sie keine der erfassten Daten löschen können, würde ich immer noch rm() und gc() verwenden, um einige der benötigten Daten zu entfernen, nur um zu sehen, ob es die gesamte Schleife durchläuft. Wenn dies der Fall ist, wissen Sie, dass es sich tatsächlich um ein Speicherverwaltungsproblem handelt.

Jetzt geht es darum, ein Skript zu schreiben, das Daten in Bündeln sammelt, in das kompakteste Format umwandelt und im permanenten Speicher speichert, bis die gesamte Verarbeitung abgeschlossen ist, und dann für die Analyse in den Arbeitsspeicher lädt. Sie können CSV- oder JSON-Dateien verwenden.

R ist eine fabelhaft mächtige Sprache, die in vielen Situationen sehr gut funktioniert, erfordert aber, dass Sie Zwischendaten und Variablen gut verwalten, wenn die Daten groß werden. Eine einfache Tabelle kann in bis zu vier Instanzen bestehen, je nachdem, wie sie manipuliert und verwaltet wird. Also, wenn Sie ein richtig funktionierendes Skript haben, dann müssen Sie daran arbeiten, wie Sie verwalten, was Sie aus diesem Skript herausholen und es in den analytischen Prozess zurückbringen.

Für mich neige ich dazu, bei großen Akten zu arbeiten, als würde ich eine ganze Kuh essen, einen Bissen nach dem anderen. Stöbern Sie nach Bedarf in den statischen Speicher und aktualisieren Sie statische Dateien.

Ich hoffe, das hilft.