【问题标题】:Saving data from SQLDataReader to FileStream with minimal memory usage以最少的内存使用将数据从 SQLDataReader 保存到 FileStream
【发布时间】:2011-11-02 18:07:54
【问题描述】:

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

【问题讨论】:

    标签: c# memory stream yield sqldatareader


    【解决方案1】:

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

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

    .NET 中的内存管理不会尝试将内存使用量保持在尽可能低的水平,因为拥有大量未使用的内存不会使计算机更快。当你创建和释放对象时,它们只会在堆上被丢弃一段时间,最终被垃圾收集器清理掉。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-12-03
      • 1970-01-01
      • 1970-01-01
      • 2015-10-07
      • 1970-01-01
      • 1970-01-01
      • 2012-04-11
      • 2010-11-29
      相关资源
      最近更新 更多