File.ReadAllText OutOfMemoryException

时间:2016-04-08 18:45:16

标签: c# sql memory-management

我有一个大的SQL脚本(大约70MB),我需要将它全部读入内存,然后拆分GO语句。

我正在执行以下操作,但获取OutOfMemoryException

var script = File.ReadAllText(scriptFile);
var scriptName = Path.GetFileName(scriptFile);
var commands = Regex.Split(script, "^GO\r\n", RegexOptions.Multiline | RegexOptions.IgnoreCase);

然后,对于commands中的每个脚本片段,我调用ExecuteNonQuery。这一切都正常,直到我尝试加载这个大的脚本文件。

有关更有效地解析该文本文件的任何建议吗?

2 个答案:

答案 0 :(得分:3)

尝试这样的事情

public static IEnumerable<string> SplitScriptOnGo(string scriptPath)
{
    var buffer = new StringBuilder();
    foreach (var line in File.ReadLines(scriptPath))
    {
        if (line == "GO")
        {
            yield return buffer.ToString();
            buffer.Clear();
        }
        else
        {
            buffer.AppendLine(line);
        }
    }
}

这将一次读取一行,将它们缓冲到StringBuilder,然后在看到“Go”行时生成缓冲区。只要你没有ToList这就可以迭代结果并执行每个SQL语句而无需将整个脚本读入内存。

答案 1 :(得分:0)

它是否在ReadAllText()或Split()上失败?

我不知道你的系统规格,但我怀疑你的内存不足,我的猜测是它在Split()上失败了,而你的分裂中的某些东西导致无限循环。

也许不是一次阅读所有内容而是直接读到第一个“去”,执行,然后继续读到下一个等等?最终它要么处理整个文件,要么它将失败(此时你会通过查看你刚刚在调试器中读到的字符串知道哪个“GO”语句导致问题。)