我最近看到了这个,见下文。使用OutofMemoryException
加载250万条记录时,我获得了DataTable
。在底部附近,有一个table.Dispose()
。内存使用量:560Mb!为什么还要使用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 :(得分:0)
我在下面对此进行了转换,现在使用的内存为250万条记录,与上述相同。使用的内存现在不到原来的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;
}
答案 1 :(得分:0)
很高兴看到您的解决方案存在问题,但我还建议您查看this discussion,其中描述DataReader是比DataTable更好的解决方案,但是it depends on it use as well。 After reading this你会理解,在DataReader的情况下,内存消耗预计会减少。
MSDN documentation中记录了使用SqlDataReader的另一个优点:
来自Remarks
的部分:
数据时由另一个进程或线程对结果集所做的更改 正在读取的内容可能对SqlDataReader的用户可见。
因此,你可能会在观察中获得这种差异。
希望它对你和其他人也有用。