2013-03-08 4 views
11

Edytuj: Naprawdę doceniam pomoc w znajdowaniu błędów - ale ponieważ może to być trudne do znalezienia/odtworzenia, ogólna pomoc w debugowaniu również byłaby bardzo doceniana! Pomóż mi pomóc sobie! =)Jak usunąć błąd pamięci Pythona?

Edytuj 2: Zawężanie, komentowanie kodu.

Edycja 3: Wygląda na to, że lxml nie jest winowajcą, dziękuję! Pełny skrypt to here. Muszę przejrzeć to, szukając referencji. Jak oni wyglądają?

Edycja 4: Właściwie skrypty zatrzymuje (idzie 100%), w tym,parse_ogczęścią. Tak więc edycja 3 jest fałszywa - w jakiś sposób musi to być lxml.

Edycja 5 MAJOR EDIT: Jak sugeruje David Robinson i TankorSmash poniżej, Znalazłem typ data treści, które wyśle ​​lxml.etree.HTML(data) w dzikim pętli. (I beztrosko lekceważyć, ale znaleźć moje grzechy odkupił jak już zapłacił cenę w wysokości dodatkowe dwa dni debugowania!;) A working crashing script is here.(Also opened a new question.)

Edycja 6: Okazuje się, że jest to błąd z wersją lxml 2.7.8 i starszą (co najmniej ). Updated to lxml 2.9.0, a błąd zniknął. Dziękuję także znakomitym ludziom pod adresem this follow-up question.

Nie wiem, jak rozwiązać ten dziwny problem, który mam. Poniższy kod działa poprawnie przez około pięć minut, gdy pamięć RAM zostanie nagle całkowicie wypełniona (od 200 MB do 1700 MB w okresie 100% - wtedy gdy pamięć jest pełna, przechodzi w stan niebieski oczekiwania).

Wynika to z poniższego kodu, w szczególności z pierwszych dwóch linii. Na pewno. Ale o co chodzi? Co może wyjaśnić to zachowanie?

def parse_og(self, data): 
    """ lxml parsing to the bone! """ 
    try: 
     tree = etree.HTML(data) # << break occurs on this line >> 
     m = tree.xpath("//meta[@property]") 

     #for i in m: 
     # y = i.attrib['property'] 
     # x = i.attrib['content'] 
     # # self.rj[y] = x # commented out in this example because code fails anyway 


     tree = '' 
     m = '' 
     x = '' 
     y = '' 
     i = '' 

     del tree 
     del m 
     del x 
     del y 
     del i 

    except Exception: 
     print 'lxml error: ', sys.exc_info()[1:3] 
     print len(data) 
     pass 

enter image description here

+1

Czy możesz połączyć HTML 'data', abyśmy mogli przetestować kod? – TankorSmash

+0

'data' to pierwsze 5000 bajtów dowolnego dokumentu HTML. – knutole

+1

Nie jest to trudne, ale wypróbowałeś go na różnych stronach i nie ma znaczenia, jakie dane przekazujesz? – TankorSmash

Odpowiedz

3

Możesz spróbować Low-level Python debugging with GDB. Prawdopodobnie jest błąd w tłumaczu Pythona lub bibliotece Lxml i trudno go znaleźć bez dodatkowych narzędzi.

Możesz przerwać działanie skryptu na gdb, gdy użycie procesora osiągnie 100% i spojrzeć na ślad stosu. Prawdopodobnie pomoże to zrozumieć, co dzieje się wewnątrz skryptu.

2

musi być ze względu na pewne odniesienia, które przechowują dokumenty żyje. zawsze należy być ostrożnym, ponieważ ciąg znaków wynika z oceny xpath. Widzę, że masz przypisane None do tree i m, ale nie do y, x i i.

Czy można również przypisać None do y, x i i.

+0

Dzięki! Wypróbowałem to. Przykro mi to mówić, ten sam wynik. – knutole

+1

czy próbowałeś użyć 'del' na tych wszystkich? –

+0

Tak, bez powodzenia. Dziękuję Ci! Zaktualizowane pytanie. – knutole

2

Narzędzia są również pomocne podczas wyszukiwania problemów z pamięcią. Znalazłem guppy jako bardzo przydatne narzędzie do profilowania i eksploracji pamięci Pythona.

Nie jest to najłatwiejsze rozpoczęcie pracy z powodu braku dobrych samouczków/dokumentacji, ale gdy już się z tym uporamy, okaże się to bardzo przydatne.Cechy ja wykorzystania:

  • Remote profilowania pamięci (poprzez gniazda)
  • Podstawowe GUI dla wykresów zużycia, opcjonalnie pokazując dane żywo
  • silne i spójne, interfejsy do odkrywania wykorzystanie danych w Pythonie powłoka
+0

Dzięki za to. Czy możesz znaleźć "utracone" odniesienia za pomocą tego narzędzia? – knutole

+1

@knutole: Z pewnym wysiłkiem, tak. Możesz zrobić migawki stanu pamięci (tj. Przed i po podejrzeniu wyzwalacza dla twojego problemu) i porównać je. Możesz zobaczyć tylko zmiany. Stamtąd możesz uzyskać najkrótszą ścieżkę pomiędzy zasięgiem globalnym a obiektem zainteresowania. – RobM