2017-11-01 11 views
5

Mam kilka dużych plików xml, 1+ gb. Muszę wykonać z nimi pewne operacje filtrowania. Najprostszym pomysłem Mam wymyślić to, aby zapisać je jako txt i ReadAllText z nich i zacząć robić pewne operacje jakJak obejść wyjątek OutOfMemory w języku C#?

var a = File.ReadAllText("file path"); 
    a = a.Replace("<", "\r\n<"); 

chwili, kiedy starają się zrobić, jednak awarie programu z pamięci. Sprawdziłem mojego menadżera zadań, gdy go uruchomiłem, a użycie pamięci RAM wzrosło do 50% iw chwili, gdy do niego dotrze program zginął.

Czy ktoś ma jakieś pomysły na temat działania z tym plikiem, unikając wyjątku OutOfMemory lub pozwalając programowi pobrać więcej pamięci.

+3

Używaj strumieni, a nie ciągów. –

+0

Czy wymiana jest "filtrowaniem", czy jest czymś innym? Spójrz na ['XmlReader'] (https://msdn.microsoft.com/en-us/library/system.xml.xmlreader (v = vs.110) .aspx), tak czy inaczej. (Myślę, że to właściwy.) – Ryan

+0

Ogólnie rzecz biorąc, staraj się * unikać * traktowania XML jako "tylko ciągi". Użyj narzędzi * zaprojektowanych * do pracy z XML w maksymalnym możliwym stopniu, chyba że to, co próbujesz wyprodukować, nie jest XML, ale jest "czymś, co wygląda jak XML, ale robię dla niego dziwne rzeczy, tak że nie jest technicznie XML więcej " –

Odpowiedz

4

Jeśli możesz zrobić to linia po linii, zamiast mówić "Przeczytaj wszystko do pamięci" za pomocą File.ReadAllText, możesz powiedzieć "Daj mi jedną linię w czasie" z File.ReadLines.

To zwróci wartość IEnumerable, która używa odroczonego wykonania. Można to zrobić tak:

using(StreamWriter sw = new StreamWriter(newFilePath)) 
foreach(var line in File.ReadLines(path)) 
{ 
    sw.WriteLine(line.Replace("<", "\r\n<")); 
    sw.Flush(); 
} 

Jeśli chcesz dowiedzieć się więcej o wykonanie odroczonej, można sprawdzić this strona GitHub.