鉴于此代码:
readFile = new FileStream(FilePath, FileMode.Open);
streamReader = new StreamReader(readFile);
dsSheet = new DataSet();
dsSheet.Tables.Add(sValidNumbersLibrary);
dsSheet.Tables[sValidNumbersLibrary].Columns.Add("Numbers");
dt50Records = dsSheet.Tables[sValidNumbersLibrary].Clone();
String sLine = string.Empty;
sLine = streamReader.ReadToEnd();
// The next line fails with System.OutOfMemoryException:
sLine = (sLine.Contains(",")) ? sLine.Replace(",", "\r\n") : sLine;
sLine = sLine.Replace("\r\n", ",");
我该如何处理System.OutOfMemoryException
?
答案 0 :(得分:0)
我会添加
streamReader.Dispose();
在sLine = streamReader.ReadToEnd()之后; 这将在您启动替换过程之前释放一些内存。
答案 1 :(得分:0)
我同意之前的评论,你应该以块的形式阅读文件,但如果你必须立即将整个块读入内存:
String.Replace()返回字符串的副本,因此在替换之后,您使用的内存是以前的两倍。请尝试使用StringBuilder.Replace(),或者如果您真的按下RAM,请将字符串加载到字节数组中并操作字符串内联。 (虽然,因为你用两个字符替换一个字符,这会带来一些问题。)
我会考虑并重温这一点。
答案 2 :(得分:0)
一旦完成操作,你打算用改变后的字符串做什么?如果您只是将其写入文件,那么您可能应该一次读取一行,执行操作,然后将更改的行写入文件。 StreamReader的readline将返回所有内容,直到遇到\ r \ n。由于您计划用“,”替换\ r \ n,您只需将逗号附加到readline返回的字符串即可。
using (StreamWriter sw = new StreamWriter(Path.GetTempFileName()))
{
using (StreamReader sr = new StreamReader(@"YourFile"))
{
while (!sr.EndOfStream)
{
string line = sr.ReadLine();
if (line != null)
{
sw.Write(line + ",");
}
}
}
}
如果您计划在代码的其余部分中使用操作文本,那么可以使用StringBuilder构建字符串(将sw.Write替换为sb.Append);但是,使用StringBuilder并不能保证您不会遇到OutOfMemoryException。大字符串是一个大字符串。如果你的字符串没有连续的内存块,那么你将获得OutOfMemoryException。另外,正如@SteveCzetty指出的那样,对string.Replace()的调用会返回字符串的副本。字符串越大,您遇到异常的可能性就越大。