Утечка памяти в 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();
}
}