大文件 - 添加行 - 内存不足

时间:2015-02-04 10:54:29

标签: c#

我有一个非常大的sql插件文件,它会抛出"内存不足"在SQL企业管理器中运行时出错。

我看到的建议是添加" GO"命令插入的每X行数都是"批处理"。

我正在尝试编写一个小函数来读取文件,每50行添加一行文本" GO"

我编写的代码在运行时也抛出了System.OutOfMemoryException。

有人可以建议更好的方法来编写我的代码来解决这个问题吗?

这就是我写的:

public static void AddGo()
    {
        int currentline = 0;

        string FilePath = @"C:\Users\trevo_000\Desktop\fmm89386.sql";

        var text = new StringBuilder();

        foreach (string s in File.ReadAllLines(FilePath))
        {
            // add the current line
            text.AppendLine(s);

            // increase the line counter
            currentline += 1;

            if (currentline == 50)
            {
                text.AppendLine("GO");
                currentline = 0;
            }
        }

        using (var file = new StreamWriter(File.Create(@"C:\Users\trevo_000\Desktop\fmm89386Clean.sql")))
        {
            file.Write(text.ToString());
        }

    }

1 个答案:

答案 0 :(得分:3)

您将文件保留在内存中,然后将其从内存写入文件。而不是在处理输入文件时写入输出文件;这种事情:

public static void AddGo() {
    int currentline = 0;

    string inputFilePath = @"C:\Users\trevo_000\Desktop\fmm89386.sql";
    string outputFilePath = @"C:\Users\trevo_000\Desktop\fmm89386Clean.sql";
    using (var outputFileStream=File.CreateText(outputFilePath)) {
        foreach (string s in File.ReadLines(inputFilePath))
        {
            // add the current line
            outputFileStream.WriteLine(s);

            // increase the line counter
            currentline += 1;

            if (currentline == 50)
            {
                outputFileStream.WriteLine("GO");
                currentline = 0;
            }
        }
    }
}

请注意在输入文件上使用ReadLines而不是ReadAllLines - 有关详细信息,请参阅What is the difference between File.ReadLines() and File.ReadAllLines()?