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

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

15   голосов , оценка 4 из 5
Похожие ответы