2013-10-08 69 views
0

請參閱以下用於寫入文本文件的代碼。但是,數據庫獲取近1百萬條記錄,所以有人可以建議一個更快的方式來做到這一點,或者我應該如何改變下面提到的代碼,以使其工作更快?將一百萬行寫入文本文件

try 
{ 
    using (OleDbConnection connection = new OleDbConnection(ConnectionString)) 
    { 
     OleDbCommand command = new OleDbCommand(queryString, connection); 
     connection.Open(); 
     OleDbDataReader reader = command.ExecuteReader(); 
     DataTable dt = new DataTable(); 
     dt.Load(reader); 

     StreamWriter writer = new StreamWriter(FilePath + FileName); 
     var result = string.Empty; 
     for (int i = 0; i < dt.Rows.Count; i++) 
     { 
      for (int j = 0; j < dt.Columns.Count; j++) 
      { 
       result += dt.Rows[i][j] + "|"; 
      } 
      result += "\r\n"; 
     } 
     writer.WriteLine(result); 

     reader.Close(); 
     writer.Close(); 

     Dts.TaskResult = (int)ScriptResults.Success; 
    } 
} 
+0

你應該避免加載100萬條記錄的表,然後遍歷該表爲一百萬時 – Steve

+0

即時閱讀從表1萬條記錄,我需要它將其寫入文本文件 –

+0

業務要求在文本文件中有一百萬條記錄 –

回答

0

您在一個數據表中加載100萬條記錄,然後再次在該表上循環寫入每一行。

也許你可以做同樣的事情,但在一半的時間,如果你讀了單排,並寫下來:也

OleDbDataReader reader = command.ExecuteReader(); 
StreamWriter writer = new StreamWriter(FilePath + FileName); 
var result = string.Empty; 
while(reader.Read()) 
{ 
    for (int j = 0; j < reader.FieldCount; j++) 
    { 
     result += reader[j] + "|"; 
    } 
    result += "\r\n"; 
} 
writer.WriteLine(result); 

,使用StringBuilder的緩衝你讀的內存,而不是不斷地寫磁盤可能是在這種情況下是非常有益的:

// This size is just for example purpose. Should be fine tuned 
StringBuilder buffer = new StringBuilder(1048576); 
while(reader.Read()) 
{ 
    for (int j = 0; j < reader.FieldCount; j++) 
    { 
     buffer.Append(reader[j] + "|"); 
    } 
    buffer.AppendLine(); 
    if(buffer.Length > 1048576 - 1024) 
    { 
     writer.Write(buffer.ToString()); 
     buffer.Length = 0; 
    } 
} 
writer.Write(buffer.ToString()); 
+0

不使用字符串連接也是有益的。該代碼正在創建一百萬個字符串。我認爲追加'reader [j]'然後附加'「|」'會更好。我不確定編譯器是否可以優化該調用。 –

+0

是的,我明白你的觀點,並且在回答問題時我有疑問。但是,然後我[記住這些測試](兩個子字符串的字符串連接比Append的調用快,所以我選擇了上面的版本。在這種情況下進行測試會很有趣 – Steve