使用最少的内存使用将数据从SQLDataReader保存到FileStream

时间:2011-11-02 18:07:54

标签: c# memory stream yield sqldatareader

我使用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();
            }
        }

1 个答案:

答案 0 :(得分:1)

一些重内存吞吐量不是问题,在处理大量数据时是不可避免的。

您读取的数据将被分配为堆上的新对象,但它们是短暂的对象,因为您只需读取数据,写入数据,然后将其丢弃。

.NET中的内存管理并不试图尽可能降低内存使用率,因为拥有大量未使用的内存并不能使计算机更快。当你创建和释放对象时,它们将被放弃在堆上一段时间,垃圾收集器最终将它们清理干净。

当您进行大量数据处理时,.NET应用程序使用大量内存是正常的,一段时间后内存使用率会再次下降。如果系统的某些其他部分需要内存,垃圾收集器将进行更积极的收集以尽可能地释放。