Утечка памяти в DataRow - C#
Формулировка задачи:
Добрый день(утро, вечер, ночь)!
Я только-только начинаю работать в большими объемами данных. и столкнулся с такой проблемой: из-за DataRow постоянно вылазит OutOfMemory. Погуглив иностранные форума, насколько мне позволяет мой ломаный инглиш, я понял что каждый следующий DataRow сохраняет в себе всю схему всего DataTable.
Т.е. вот такой код:
, при больших количествах данных вываливается в нехватку памяти. Можно ли как-нибудь этого избежать?
private void Handle(Dictionary<string, int> xmlfiles) { List<XmlDocument> xmldoc = new List<XmlDocument>(); string[] XmlInner = new string[xmlfiles.Count]; XElement[] xml = new XElement[xmlfiles.Count]; DataTable TagB = new DataTable("TagB"); TagB.Columns.Add("VKU", typeof(long)); TagB.Columns.Add("owner_file", typeof(string)); TagB.Columns.Add("T", typeof(int)); TagB.Columns.Add("D", typeof(int)); TagB.Columns.Add("S", typeof(int)); TagB.Columns.Add("ID", typeof(string)); TagB.Columns.Add("I", typeof(int)); TagB.Columns.Add("UCH", typeof(string)); for (int i = 0; i < xmlfiles.Count; i++) { XmlReader reader = XmlReader.Create(xmlfiles.Keys.ToArray()[i]); while (reader.Read()) { DataRow Brow = TagB.NewRow(); switch (reader.NodeType) { case XmlNodeType.Element: if(reader.Name == "B") { while (reader.MoveToNextAttribute()) { switch (reader.Name) { case "T": Brow["T"] = reader.Value; break; case "D": Brow["D"] = reader.Value; break; case "S": Brow["S"] = reader.Value; break; case "ID": Brow["ID"] = reader.Value; break; case "I": Brow["I"] = reader.Value; break; } } TagB.Rows.Add(Brow); } break; /* * case XmlNodeType.Element: // Узел является элементом. Console.Write("<" + reader.Name); while (reader.MoveToNextAttribute()) // Чтение атрибутов. Console.Write(" " + reader.Name + "="" + reader.Value + """); Console.WriteLine(">"); break; case XmlNodeType.Text: // Вывести текст в каждом элементе. Console.WriteLine(reader.Value); break; case XmlNodeType.EndElement: // Вывести конец элемента. Console.Write("</" + reader.Name); Console.WriteLine(">"); break; */ } } } }
Решение задачи: «Утечка памяти в DataRow»
textual
Листинг программы
void WriteToBase(List<MyClass> mc) { //Create Connection using (TransactionScope scope = new TransactionScope()) { string sqlIns = "INSERT INTO table (name, information, other) VALUES (@name, @information, @other)"; SqlCommand cmdIns = new SqlCommand(sqlIns, Connection); for(int i=0;i<mc.Count;i++) { cmdIns.Parameters.Add("@name", mc[i].a); cmdIns.Parameters.Add("@information", mc[i].b); cmdIns.Parameters.Add("@other", mc[i].c); cmdIns.ExecuteNonQuery(); } scope.Complete(); } }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д