Утечка памяти в 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();
- }
- }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д