我使用yield语句将SQLDataReader包装为IEnumberable。我想用它来转储到一个文件。我看到一些相当大的内存利用率。想知道是否有人对如何以最小或设置内存利用率这样做有任何想法。我不介意指定一个缓冲区,我只想知道在我不知情的服务器上释放它之前它会是什么。
我一直在使用以下内容:
class Program
{
static void Main(string[] args)
{
var fs = File.Create("c:\\somefile.txt");
var sw = new StreamWriter(fs);
foreach (var asdf in Enumerable.Range(0, 500000000))
{
sw.WriteLine("adsfadsf");//Data from Reader
}
sw.Close();
}
}
string commandText = @"SELECT name FROM {0} WHERE name NOT LIKE '%@%'";
SqlCommand sqlCommand = new SqlCommand(string.Format(commandText, list.TableName.SQLEncapsulate()),
_connection);
using (SqlDataReader sqlDataReader = sqlCommand.ExecuteReader())
{
while (sqlDataReader.Read())
{
yield return sqlDataReader["name"].ToString();
}
}
答案 0 :(得分:1)
一些重内存吞吐量不是问题,在处理大量数据时是不可避免的。
您读取的数据将被分配为堆上的新对象,但它们是短暂的对象,因为您只需读取数据,写入数据,然后将其丢弃。
.NET中的内存管理并不试图尽可能降低内存使用率,因为拥有大量未使用的内存并不能使计算机更快。当你创建和释放对象时,它们将被放弃在堆上一段时间,垃圾收集器最终将它们清理干净。
当您进行大量数据处理时,.NET应用程序使用大量内存是正常的,一段时间后内存使用率会再次下降。如果系统的某些其他部分需要内存,垃圾收集器将进行更积极的收集以尽可能地释放。