我有一个大的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
。这一切都正常,直到我尝试加载这个大的脚本文件。
有关更有效地解析该文本文件的任何建议吗?
答案 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”语句导致问题。)