将许多行写入文件中

时间:2016-07-21 15:42:19

标签: c# io stream

我有一个进程可以获取很多行的表。需要在报告表中报告此行。我现在所做的事情太慢了,因为有很多行(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);
        }
    }

3 个答案:

答案 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编写部分结果(例如逐行)。