Утечка памяти в DataRow - C#

Узнай цену своей работы

Формулировка задачи:

Добрый день(утро, вечер, ночь)! Я только-только начинаю работать в большими объемами данных. и столкнулся с такой проблемой: из-за DataRow постоянно вылазит OutOfMemory. Погуглив иностранные форума, насколько мне позволяет мой ломаный инглиш, я понял что каждый следующий DataRow сохраняет в себе всю схему всего DataTable. Т.е. вот такой код:
Листинг программы
  1. private void Handle(Dictionary<string, int> xmlfiles)
  2. {
  3. List<XmlDocument> xmldoc = new List<XmlDocument>();
  4. string[] XmlInner = new string[xmlfiles.Count];
  5. XElement[] xml = new XElement[xmlfiles.Count];
  6. DataTable TagB = new DataTable("TagB");
  7. TagB.Columns.Add("VKU", typeof(long));
  8. TagB.Columns.Add("owner_file", typeof(string));
  9. TagB.Columns.Add("T", typeof(int));
  10. TagB.Columns.Add("D", typeof(int));
  11. TagB.Columns.Add("S", typeof(int));
  12. TagB.Columns.Add("ID", typeof(string));
  13. TagB.Columns.Add("I", typeof(int));
  14. TagB.Columns.Add("UCH", typeof(string));
  15. for (int i = 0; i < xmlfiles.Count; i++)
  16. {
  17. XmlReader reader = XmlReader.Create(xmlfiles.Keys.ToArray()[i]);
  18. while (reader.Read())
  19. {
  20. DataRow Brow = TagB.NewRow();
  21. switch (reader.NodeType)
  22. {
  23. case XmlNodeType.Element:
  24. if(reader.Name == "B")
  25. {
  26. while (reader.MoveToNextAttribute())
  27. {
  28. switch (reader.Name)
  29. {
  30. case "T":
  31. Brow["T"] = reader.Value;
  32. break;
  33. case "D":
  34. Brow["D"] = reader.Value;
  35. break;
  36. case "S":
  37. Brow["S"] = reader.Value;
  38. break;
  39. case "ID":
  40. Brow["ID"] = reader.Value;
  41. break;
  42. case "I":
  43. Brow["I"] = reader.Value;
  44. break;
  45. }
  46. }
  47. TagB.Rows.Add(Brow);
  48. }
  49. break;
  50. /*
  51. * case XmlNodeType.Element: // Узел является элементом.
  52. Console.Write("<" + reader.Name);
  53. while (reader.MoveToNextAttribute()) // Чтение атрибутов.
  54. Console.Write(" " + reader.Name + "="" + reader.Value + """);
  55. Console.WriteLine(">");
  56. break;
  57. case XmlNodeType.Text: // Вывести текст в каждом элементе.
  58. Console.WriteLine(reader.Value);
  59. break;
  60. case XmlNodeType.EndElement: // Вывести конец элемента.
  61. Console.Write("</" + reader.Name);
  62. Console.WriteLine(">");
  63. break;
  64. */
  65. }
  66. }
  67. }
  68. }
, при больших количествах данных вываливается в нехватку памяти. Можно ли как-нибудь этого избежать?

Решение задачи: «Утечка памяти в DataRow»

textual
Листинг программы
  1. void WriteToBase(List<MyClass> mc)
  2. {
  3.   //Create Connection
  4.   using (TransactionScope scope = new TransactionScope())
  5.   {
  6.     string sqlIns = "INSERT INTO table (name, information, other)
  7.                     VALUES (@name, @information, @other)";
  8.  
  9.     SqlCommand cmdIns = new SqlCommand(sqlIns, Connection);
  10.  
  11.     for(int i=0;i<mc.Count;i++)
  12.     {
  13.       cmdIns.Parameters.Add("@name", mc[i].a);
  14.       cmdIns.Parameters.Add("@information", mc[i].b);
  15.       cmdIns.Parameters.Add("@other", mc[i].c);
  16.       cmdIns.ExecuteNonQuery();
  17.     }
  18.     scope.Complete();    
  19.   }
  20. }

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


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

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

15   голосов , оценка 4 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы