2016-07-21 11 views
0

Ich habe einen Prozess, der viele Zeilen einer Tabelle bekommt. Diese Zeilen müssen in einem Berichtsblatt gemeldet werden. Was ich gerade mache, ist zu langsam, weil es so viele Zeilen gibt (600.000 < = x) -Rows. Ich zeige, was ich jetzt mache Ihnen eine Vorstellung zu geben, was ich tue:Viele Zeilen in eine Datei effizient schreiben

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"; 
     } 
} 

und nach:

 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

Eine Sache, die Sie tun können, ist die Verwendung eines 'StringBuilder' anstelle von so vielen String-Verkettungen. Mit dieser kleinen Änderung könnten Sie eine deutliche Verbesserung feststellen. – itsme86

Antwort

1

Starten von String und sehen, wo, dass Sie bekommt . Sie kopieren sehr viel Speicher mit stringx = stringx + stringy, weil es ein neues Objekt erstellt und alles in das neue Objekt kopiert. Ich habe das Gefühl, dass es dich dahin bringt, wo du sein musst. Stringbuilder reserviert im Gegensatz Speicher vor.

Darüber hinaus könnten Sie Dinge wie teilen Sie die Daten in Partitionen und Multithread das, und kombinieren Sie dann die Ergebnisse am Ende.

+0

Danke! das ist wonach ich gesucht habe. :) – Ams1

2

Verwenden Sie einen StringBuilder, der beim Hinzufügen von Strings effizienter ist. In C# erstellt "+" jedes Mal eine neue Zeichenfolge! Verwenden Sie AppendLine, Append, AppendFormat usw., und wenn ToString() fertig ist.

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

Dann

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

Sry, dass ich dir keine Zecke gegeben habe. Aber Ihr Awner in Kombination mit einem anderen Awner war die Lösung für mein Problem. Sie können sich also einen hypothetischen Tick vorstellen: P. VIELEN DANK! – Ams1

0

String wird Ihnen helfen, den Bericht im Speicher wesentlich effizienter zu bauen. Aber das Ergebnis ist immer noch vollständig gespeichert. Um dies zu vermeiden, könnten Sie Teilergebnisse (z. B. Zeile für Zeile) unter Verwendung einer FileStream schreiben.