2010-04-09 12 views
5

Jeśli robięCzy dokument XPathDocument wczytuje cały dokument XML?

XPathDocument doc = new XPathDocument("filename.xml"); 

Czy to obciążenie cały dokument do pamięci? Piszę aplikację na telefon komórkowy i dokument może przechowywać wiele danych, które nigdy nie muszą być ładowane w tym samym czasie. Telefony komórkowe zwykle nie mają zbyt dużo pamięci RAM!

+0

interesujące, C# runtime na telefon komórkowy. – Anurag

Odpowiedz

5

Tak, cały dokument XML jest reprezentowany w pamięci.

Jednym z rozwiązań jest podzielenie dużego dokumentu XML na wiele mniejszych.

Lub, alternatywnie, możesz napisać własną wersję XmlReader, która zignoruje niechciane poddrzew. Możesz przekazać ten argument XmlReader jako argument do konstruktora XpathDocument() - trzeba go zamaskować jako TextReader.

+0

Czy istnieje lepszy sposób ładowania pewnych części dokumentu XML? Jak niektóre tagi? – Wires

+0

@wires: Nie jest to rozwiązanie systemowe, ale możesz napisać własny XmlReader, który zignoruje niechciane poddrzewki. Możesz przekazać ten XmlReader jako argument do konstruktora XpathDocument() - musisz go zamaskować jako TextReader. :) –

-1

Możesz spróbować wypróbować innego konstruktora XPathDocument(stream). Przesyłanie strumieniowe dokumentu nie będzie zużywać tak dużo pamięci.

Może nie będziesz musiał spojrzeć na Linq to XML, ponieważ łatwiej, szybciej kodujesz i tworzysz piękniejszy kod niż w przypadku analizy SAX/DOM. Zobacz ten wpis: How to Store data without using Database and how to retrieve them?

+1

Korzystanie z konstruktora Stream nie ma wpływu na ilość pamięci używanej przez XPathDocument. A Linq do XML nie jest szybszy niż SAX (lub używa XmlReader, który jest używany w .NET zamiast SAX), ani - w przeciwieństwie do używania XmlReader - nie pozwala na czytanie całego dokumentu w pamięci. –

+0

W odniesieniu do konstruktora strumienia, dlatego napisałem "możesz chcieć". Z drugiej strony, myślę, że powinieneś rzucić okiem na to, jak Linq przesyła dane i nie ładuje pełnego pliku do pamięci. – ALOToverflow

+0

Klasa XStreamingElement może pisać bardzo duży dokument XML bez tworzenia całego dokumentu XML w pamięci. Ale nie służy do czytania. Kiedy większość ludzi mówi o Linqu do XML (jak w obu przykładach, z którymi się łączyłeś), mówią o XDocument, a XDocument w rzeczywistości ładuje cały dokument XML do pamięci. Czy jest jakiś niesamowity obiekt Linq, który przeoczyłem? Uwierz mi, to jest coś, o czym chciałbym się mylić. –

1

Czasami warto spojrzeć na XStreamingElement LINQ do XML:

Reprezentuje elementy w drzewie XML, który obsługuje wyjście odroczony streamingu.

Ta klasa umożliwia utworzenie drzewa XML , które obsługuje odtwarzanie z opóźnioną transmisją . Za pomocą tej klasy można utworzyć drzewo XML w bardzo podobny sposób, , tworząc drzewo XML, korzystając z XElement o wartości . Istnieje jednak zasadnicza różnica między . Podczas korzystania zapytanie LINQ do określenia zawartości kiedy tworzenia drzewa XML przy użyciu Xelement, zmienna zapytanie jest podkreślone na czas budowy drzewa XML, oraz wyniki kwerendy dodaje do drzewa XML . Natomiast po utworzeniu drzewa XML przy użyciu przy użyciu XStreamingElement, odniesienie do zmiennej zapytania jest przechowywane w drzewie XML bez konieczności iteracji. Zapytania są iterowane tylko po serializacji. Umożliwia to tworzenie większych drzewek XML przy zachowaniu mniejszego rozmiaru pamięci .

Jeśli strumieniowe ze źródła wejściowego , takiego jak plik tekstowy, a następnie można odczytać bardzo duży plik tekstowy, a wygenerować bardzo duży dokument XML zachowując niewielką pamięć ślad.