2011-01-22 21 views
5

Mam duży plik xml, który zawiera wiele elementów podrzędnych. Chcę móc uruchomić niektóre zapytania xpath. Próbowałem używać vtd-xml w java, ale czasami dostaję błąd outofmemory, ponieważ xml jest tak duży, że mieści się w pamięci. Czy istnieje alternatywny sposób przetwarzania tak dużych plików xml.Przetwarzanie dużych plików xml

+0

Dlaczego na tym pytaniu jest tag Pythona? Czy masz nadzieję, że ludzie będą oferować rozwiązania Python? – Spaceghost

+0

Czy występują błędy pamięci podczas analizowania dokumentu lub podczas korzystania z zapytań xpath? Jeśli drugi, być może problem dotyczy kwerendy xpath. Tak czy inaczej, czy próbowałeś zwiększyć wartość -Xmx dla sterty dla JVM? – Spaceghost

+0

spróbuj rozszerzonego pliku vtd-xml i użyj opcji odwzorowania pamięci –

Odpowiedz

2

jest bardzo skuteczny przy pracy z dużymi plikami

+1

Nie można używać XPath z bezpośrednim strumieniem SAX (brak ponownego przeanalizowania całego pliku dla każdego zapytania). –

+0

@Glenn Maynard - ale z pewnością OP * musi * dokonać ponownej analizy pliku dla każdego zapytania (lub serii zapytań). DOM jest zbyt duży, aby zmieścić się w pamięci. –

2

Co chcesz teraz zrobić? Odgłosami tego próbujesz użyć parsera opartego na DOM, który zasadniczo ładuje cały plik XML do pamięci jako reprezentację DOM. Jeśli masz do czynienia z dużym plikiem, lepiej skorzystaj z parsera SAX, który przetwarza dokument XML w streamingu.

ja osobiście polecam StAX do tego.

0

Czy używasz standardowego VTD lub rozszerzoną VTD-xml? Jeśli używasz rozszerzonego XML, masz możliwość użycia mapowania pamięci ... czy próbowałeś tego?

0

Korzystanie XPath może nie być dobrym pomysłem, jeśli plan na kompilacji wielu wyrażeń dynamicznie w długo żył aplikacji.

Nie jestem do końca pewien, jak wersja Java XPath działa, ale w .NET XPath kompiluje dynamiczny montaż następnie dodaje go do domeny aplikacji. Kolejne zastosowania wyrażenia wyglądają na złożenie załadowane do pamięci.
W jednym przypadku, w którym używałem XPath, doprowadziło to do sytuacji, w której myślę, że ten sam rodzaj mechanizmu spowalniał zapełnianie pamięci podobnej do wycieku pamięci.

Moja teoria jest taka, że ​​jak każde wyrażenie został skompilowany przy użyciu wartości z użytkownikiem, co było prawdopodobnie skompilowane wyrażenia wyjątkowy, więc nowa ekspresja została opracowana i dodany do domeny aplikacji.
Ponieważ można wyjąć zespół z domeny aplikacji bez konieczności ponownego uruchamiania aplikacji całą domenę, pamięć została konsumowane każdorazowo wyrazem była oceniana i nie może zostać odzyskane. W wyniku tego kod wyciekał pamięć w postaci złożeń w pamięci, a po chwili dobrze znamy wyniki.

Powiązane problemy