执行以下代码几秒钟后,我出现内存不足异常。在抛出异常之前,它不会写任何内容。文本文件大小约为半千兆字节。我写的文本文件最终将达到3/4千兆字节。是否有任何技巧可以解决此异常?我认为这是因为文本文件太大了。
public static void ToCSV(string fileWRITE, string fileREAD)
{
StreamWriter commas = new StreamWriter(fileWRITE);
var readfile = File.ReadAllLines(fileREAD);
foreach (string y in readfile)
{
string q = (y.Substring(0,15)+","+y.Substring(15,1)+","+y.Substring(16,6)+","+y.Substring(22,6)+ ",NULL,NULL,NULL,NULL");
commas.WriteLine(q);
}
commas.Close();
}
我已将代码更改为以下内容但仍然可以获得同样的操作吗?
public static void ToCSV(string fileWRITE, string fileREAD)
{
StreamWriter commas = new StreamWriter(fileWRITE);
using (FileStream fs = File.Open(fileREAD, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
using (BufferedStream bs = new BufferedStream(fs))
using (StreamReader sr = new StreamReader(bs))
{
string y;
while ((y = sr.ReadLine()) != null)
{
string q = (y.Substring(0, 15) + "," + y.Substring(15, 1) + "," + y.Substring(16, 6) + "," + y.Substring(22, 6) + ",NULL,NULL,NULL,NULL");
commas.WriteLine(q);
}
}
commas.Close();
}
答案 0 :(得分:1)
在以下文章中,您可以找到许多用于读取和写入大文件的方法。 Reading large text files with streams in C#
基本上你只需要读取一个将被重用的缓冲区中的字节。这样您就可以将非常少量的文件加载到内存中。
答案 1 :(得分:1)
尝试逐行阅读和处理,而不是阅读整个文件。 这样你就不会冒险进入内存不足的异常。因为即使您成功为程序组织了更多内存,也会有一天文件将再次过大。
但是如果你使用更少的内存,程序可能会失去速度,所以基本上你必须平衡内存使用和执行时间。一种解决方法是使用缓冲输出,一次读取多行或者在多个线程中转换字符串。
答案 2 :(得分:1)
逐行阅读文件,它可以帮助您避免OutOfMemoryException
。我个人更喜欢使用using
来处理流。它确保在发生异常时关闭文件。
public static void ToCSV(string fileWRITE, string fileREAD)
{
usint(var commas = new StreamWriter(fileWRITE))
using(var file = new StreamReader("yourFile.txt"))
{
var line = file.ReadLine();
while( line != null )
{
string q = (y.Substring(0,15)+","+y.Substring(15,1)+","+y.Substring(16,6)+","+y.Substring(22,6)+ ",NULL,NULL,NULL,NULL");
commas.WriteLine(q);
line = file.ReadLine();
}
}
}