【问题标题】:Writing many rows into a file efficently有效地将多行写入文件
【发布时间】:2016-11-25 07:20:57
【问题描述】:

我有一个获取表格多行的进程。这些行需要在报告表中报告。我目前正在做的事情太慢了,因为行数太多(600.000

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

【问题讨论】:

  • 您可以做的一件事是使用StringBuilder,而不是进行如此多的字符串连接。您可能会看到这一微小变化的显着改善。

标签: c# io stream


【解决方案1】:

使用更有效的添加字符串的 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());

【讨论】:

  • 对不起,我没有给你打勾。但是您的遮阳篷与其他遮阳篷相结合是解决我问题的方法。所以请随意想象一个假设的勾号:P。谢谢!
【解决方案2】:

从使用 StringBuilder 开始,看看它会带来什么。您正在使用 stringx = stringx+ stringy 复制大量内存,因为它会创建一个新对象并将其全部复制到新对象中。我有一种感觉,它会让你到达你需要的地方。相比之下,Stringbuilder 会预先分配内存。

除此之外,您还可以执行诸如将数据划分为分区和多线程之类的操作,然后在最后合并结果。

【讨论】:

  • 谢谢!这就是我要找的。 :)
【解决方案3】:

StringBuilder 将帮助您更有效地在内存中构建报表。但结果仍然完全留在记忆中。为避免这种情况,您可以使用FileStream 编写部分结果(例如逐行)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-06-29
    • 2017-10-08
    • 2018-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多