我有一个进程可以获取很多行的表。需要在报告表中报告此行。我现在所做的事情太慢了,因为有很多行(600.000 <= x)-Rows。 我将展示我现在正在做的事情,以便让您了解我正在做的事情:&/ p>
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";
}
}
之后:
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 :(得分:2)
使用StringBuilder,这是一种更有效的广告添加字符串。在c#&#34; +&#34;每次都创建一个新的字符串! 使用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());
答案 1 :(得分:1)
首先使用StringBuilder,看看它在哪里。你使用stringx = stringx + stringy复制大量内存,因为它创建了一个新对象并将所有对象复制到新对象中。我有一种感觉,它会让你到达你需要的地方。相反,Stringbuilder预分配内存。
除此之外,你可以做一些事情,比如将数据划分为多个分区,多线程,然后在最后组合结果。
答案 2 :(得分:0)
StringBuilder将帮助您更有效地在内存中构建报表。但结果仍然完整地存在于内存中。为避免这种情况,您可以使用FileStream
编写部分结果(例如逐行)。