2014-01-03 1 views
0

Я недавно увидел это, см. Ниже. Я получил OutofMemoryException при загрузке 2,5 миллиона записей с DataTable. И внизу, есть table.Dispose(). Использование памяти: 560Mb! Зачем использовать DataTable?Ограничьте использование DataTable

public string[] GetIDs() 
{ 
    DataTable table = new DataTable(); 
    using (SqlConnection dwConn = new SqlConnection(this.ConnectionString)) 
    { 
     dwConn.Open(); 
     SqlCommand cmd = dwConn.CreateCommand(); 
     cmd.CommandText = "SELECT ID FROM Customer"; 
     SqlDataReader reader = cmd.ExecuteReader(); 
     table.Load(reader); 
    } 
    var result = new string[table.Rows.Count]; 
    for(int i = 0; i < result.Length; i++) 
    { 
     result[i] = table.Rows[i].ItemArray[0].ToString(); 
    } 
    table.Dispose(); 
    table = null; 
    return result; 
} 
+0

У вас, кажется, есть ответ на свой вопрос довольно быстро - зачем спрашивать? – geedubb

+0

@geedubb Это должно помочь другим, которые попадают в такие же ситуации –

+2

Непонятно, каков реальный * вопрос *, хотя ... –

ответ

0

Я превратил это в следующем, а используемая память была 250 МБ для 2,5 миллионов записей, как указано выше. Используемая память теперь составляет менее 45% от оригинала.

public IEnumerable<String> GetIDs() 
{ 
    var result = new List<string>(); 
    using (var dwConn = new SqlConnection(ConnectionString)) 
    { 
     dwConn.Open(); 
     SqlCommand cmd = dwConn.CreateCommand(); 
     cmd.CommandText = "SELECT ID FROM Customer"; 
     using (SqlDataReader reader = cmd.ExecuteReader()) 
     { 
      while (reader.Read()) 
      { 
       result.Add(reader["ID"].ToString()); 
      } 
     }     
    } 
    return result; 
} 
+0

Я уверен, что вы делаете что-то неправильно с 'DataTable'. просто 'DataTable' не добавит' 250Mb' памяти –

0

Ее приятно видеть, что у вас есть проблемы с вашим решением, но я также рекомендовал бы взглянуть на this discussion, которая изображает, что DataReader является лучшим решением, чем DataTable, но it depends on it use as well. After reading this вы поймете, что потребление памяти, как ожидается, будет меньше в случае DataReader.

Еще одно преимущество с помощью SqlDataReader документирована в MSDN documentation является:

Часть из Remarks:

Изменения, внесенные в наборе результатов другим процессом или потоком, а данные считывается, может быть видна пользователя SqlDataReader.

Так что это возможная причина, по которой вы получаете эту разницу в наблюдении.

Надеюсь, это полезно и вам, и другим людям.

Смежные вопросы