2016-07-21 12 views
0

私は、テーブルの多くの行を取得するプロセスを持っています。この行は、レポートシートにレポートする必要があります。非常に多くの行(600.000 < = x) - 行があるので、私が現時点でやっていることはあまりにも遅いです。それはあなたを取得する場所のStringBuilderを使用して多くの行を効率よくファイルに書き込む

 private void CreateReportFile() { 
     MyLog.WriteToLog("Creating ReportFile "+newModel.TableName, MyLog.Messages.Info); 
     string dir = Settings.Default.ReportFolder + "\\" + directoryName + " " + DateTime.Now.ToString("dd-MM-yyyy"); 
     Directory.CreateDirectory(dir); 

     try { 
      File.WriteAllText(dir + "\\Report " + newModel.TableName, report); 
     } catch (DirectoryNotFoundException e) { 

      Console.WriteLine(e.Message + "\n" + e.StackTrace); 
     } 
    } 
+0

あなたができることの1つは、非常に多くの文字列連結を行うのではなく、 'StringBuilder'を使うことです。その小さな変化で大きな改善が見られるかもしれません。 – itsme86

答えて

1

スタートし、次を参照してください。

private void ShowNotFoundRows() { 

     report += "NOT FOUND - Rows"; 
     report += "\r\n"; 
     report += "In Current:"; 
     report += "\r\n"; 
     string Columns = "|"; 
     foreach (string header in currentModel.Columns) { 
      Columns += header + "|"; 
     } 
     report += Columns; 
     report += "\r\n"; 
     foreach (string row in newModel.Keys) { 
      report += row + "\r\n"; 
     } 
     report += "\r\n"; 
     report += "In New:"; 
     report += "\r\n"; 
     report += Columns; 
     report += "\r\n"; 
     foreach (string row in currentModel.Keys) { 
      report += row + "\r\n"; 
     } 
} 

以降: 私はあなたに私がやっているかのアイデアを与えるために、今やっているかを示すだろう。あなたはstringx = stringx + stringyを使ってたくさんのメモリにコピーしています。新しいオブジェクトを作成し、それを新しいオブジェクトにコピーするからです。私は、あなたが必要とされるところにあなたを連れて行く気分があります。対照的にStringbuilderはメモリを事前に割り当てます。

それ以外にも、データを複数のパーティションに分割し、それらをマルチスレッド化し、最後に結果を結合するなどの作業を行うことができます。

+0

ありがとうございました!私が探していたものです。 :) – Ams1

2

文字列を追加するより効率的なStringBuilderを使用します。 Cでは、 "+"新しい文字列を毎回作成します! AppendLine、Append、AppendFormatなどを使用し、ToString()を終了すると使用します。

var report = new StringBuilder(); 
report.AppendLine("NOT FOUND - Rows"); 
report.AppendLine("In Current:"); 
... 

その後

File.WriteAllText(dir + "\\Report " + newModel.TableName, report.ToString()); 
+0

私はダニを与えなかったことを知らせてください。しかし、あなたの殻は他の殻と組み合わせて私の問題の解決策でした。だから、仮説的なダニを想像してみてください。ありがとう! – Ams1

0

StringBuilderのは、はるかに効率的にメモリにレポートを作成するのに役立ちます。しかし、結果はまだ完全にメモリに保持されています。これを避けるには、FileStreamを使用して部分的な結果(行単位など)を書くことができます。

関連する問題