2014-06-30 11 views
5

Próbuję uruchomić prosty program do wyodrębniania tabel z kodu HTML. Jednak wydaje się, że istnieje pewien problem z pamięcią w readHTMLTable w pakiecie XML. Czy jest jakiś sposób, abym mógł po prostu obejść to łatwo. Jakoś określenie specjalnej pamięci dla tego polecenia, a następnie zwolnienie go ręcznie.Obejście problemu wycieku pamięci R z pakietem XML

Próbowałem umieścić to w funkcji i próbowałem użyć gc() i różnych wersji R i tego pakietu i nic nie działa. Zaczynam rozpaczać.

Przykładowy kod. Jak uruchomić to bez eksplozji rozmiaru pamięci?

library(XML) 
a = readLines("http://en.wikipedia.org/wiki/2014_FIFA_World_Cup") 
while(TRUE) { 
    b = readHTMLTable(a) 
    #do something with b 
} 

Edit: Coś takiego jeszcze bierze wszystko z mojej pamięci:

library(XML) 
a = readLines("http://en.wikipedia.org/wiki/2014_FIFA_World_Cup") 
f <- function(x) { 
    b = readHTMLTable(x) 
    rm(x) 
    gc() 
    return(b) 
} 

for(i in 1:100) { 
    d = f(a) 
    rm(d) 
    gc() 
} 
rm(list=ls()) 
gc() 

Używam Win 7 32bit i starał się i 64bit.

+0

Mam poważne problemy z pamięcią przy użyciu pakietu 'XML' w systemie Windows. Moim rozwiązaniem jest okresowe restartowanie R (zapisywanie danych do CSV). Wysłałem e-maila do autora pakietu. Wymieniliśmy kilka e-maili, ale w zasadzie powiedział, że nie może/nie będzie debugować systemu Windows. – rrs

+0

Ok. Ponowne uruchamianie R działa, ale nie jest to takie przyjemne zadanie ręczne co 5 minut. Domyślam się, że jedynym wyjściem jest przejście na Linuksa. XML to bardzo fajny pakiet, ale niestety zniszczony z powodu tych problemów z pamięcią. – Pekka

Odpowiedz

0

Miałem wiele problemów z wyciekami pamięci również w paczce XML (zarówno w systemie Windows, jak i Linux), ale sposobem w jaki rozwiązałem to ostatecznie było usunięcie obiektu na końcu każdego kroku przetwarzania, tj. Dodanie rm (b) i gc() na końcu każdej iteracji. Daj mi znać, jeśli to działa również dla Ciebie.

+0

Nie pomaga wewnątrz pętli ani po pętli. – Pekka

+0

Cóż, zrobiłem to, aby umieścić przetwarzanie XML w funkcji XMLproc, która zwróciła wyjście, a w funkcji, w której wywoływałem XMLproc, dodałem rm (out) i gc(). Czy możesz sprawdzić, czy to działa dla ciebie? –

+0

Nie dostałem nic podobnego do tej pracy. Dodałem coś, co próbowałem w pierwotnym pytaniu. – Pekka

0

sam problem tutaj, nawet nic nie robi więcej niż czytanie w dokumencie z doc <- xmlParse(...); root <- xmlRoot(doc), pamięć przydzielona doc jest po prostu nigdy nie wydany na O/S (jak monitorowane w Menedżerze zadań Windows').

Szalonym pomysłem, który moglibyśmy wypróbować, jest zastosowanie system("Rscript ...") do wykonania analizowania XML w oddzielnej sesji R, zapisując przeanalizowany obiekt R do pliku, który następnie wczytaliśmy w głównej sesji R. Hacky, ale przynajmniej zapewni, że jakakolwiek pamięć zostanie pobrana przez parsowanie XML, zostanie zwolniona, gdy sesja Rscript zakończy się i nie wpłynie na główny proces!

+0

Rozwiązałem to, przenosząc się do Pythona i BeautifulSoup dawno temu :) W każdym razie, doceń swoją pomoc. Wkrótce wypróbuję Twoje rozwiązanie. – Pekka

+0

Zobacz też odpowiedź, którą podałem na http://stackoverflow.com/questions/23696391/memory-leak-when-using-package-xml-on-windows/ ponownie używając nowej biblioteki xml2 (wysłałem ją jako odpowiedź na to pytanie, ale ktoś go usunął). –

0

Od XML 3,98-1.4 i R 3.1 na Win7, ten problem można rozwiązać doskonale, korzystając z funkcji free(). Ale nie działa z readHTMLTable(). Poniższy kod działa doskonale.

library(XML) 
a = readLines("http://en.wikipedia.org/wiki/2014_FIFA_World_Cup") 
while(TRUE){ 
    b = xmlParse(paste(a, collapse = "")) 
    #do something with b 
    free(b) 
} 

Pakiet xml2 ma podobne problemy i pamięć może zostać zwolniony za pomocą funkcji remove_xml() następnie gc().

Powiązane problemy