2011-11-02 42 views
0

我已經使用yield語句將一個SQLDataReader包裝爲一個IEnumberable。我想用它來轉儲到一個文件。我看到一些相當大的內存使用率。想知道是否有人對如何以最小或設置的內存利用率做到這一點有任何想法。我不介意指定一個緩衝區,我只想知道它會在沒有懷疑的服務器上釋放它之前會是什麼。將數據從SQLDataReader保存到FileStream,使用最少的內存使用

我一直在使用類似以下內容:

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

一些沉重的內存吞吐量是沒有問題的,而且是不可避免的,當你處理大量的數據。

您讀取的數據將作爲堆中的新對象進行分配,但是當您剛讀取數據,寫入數據然後將其丟棄時,它們就是短暫的對象。

.NET中的內存管理不會盡可能降低內存使用率,因爲大量未使用的內存不會使計算機更快。當你創建和釋放對象時,它們只會在堆上放棄一段時間,最終垃圾收集器會清理它們。

當您正在執行一些繁重的數據處理時,.NET應用程序使用大量內存是很正常的,而內存使用情況在一段時間後會再次下降。如果系統的其他部分需要內存,垃圾收集器將進行更積極的收集以儘可能釋放。