我想读一个巨大的.txt文件,因为它的大小,我得到了内存溢出。
任何帮助?
private void button1_Click(object sender, EventArgs e)
{
using (var Reader = new StreamReader(@"C:\Test.txt"))
{
textBox1.Text += Reader.ReadLine();
}
}
文本文件只是:
Line1
Line2
Line3
字面意思就是这样。
我想将文本文件加载到多行文本框中,100%复制。
答案 0 :(得分:3)
使用以下内容可以获得更快的性能:
textBox1.Text = File.ReadAllText(@"C:\Test.txt");
它也可能对你的内存问题有所帮助,因为你通过在每行读取时连续分配较大的字符串来浪费大量内存。
当然,GC应该在您看到OutOfMemoryException
之前收集较旧的字符串,但无论如何我都会给出上面的镜头。
答案 1 :(得分:3)
首先,您发布的代码只会将文件的第一行放入TextBox
。你想要的是这个:
using (var reader = new StreamReader(@"C:\Test.txt"))
{
while (!reader.EndOfStream)
textBox1.Text += reader.ReadLine();
}
现在OutOfMemoryException
:我没有对此进行过测试,但您是否尝试过使用TextBox.AppendText
方法而不是+=
?后者肯定会分配大量的字符串,当你接近文件末尾时,大多数字符串几乎都是整个文件的长度。
据我所知,AppendText
也是这样做的;但它的存在让我怀疑它是用来处理这种情况的。我可能错了 - 就像我说的那样,没有亲自测试过。
答案 2 :(得分:2)
一次读取并处理一行,或将其分成块并单独处理块。您还可以向我们展示您拥有的代码,并告诉我们您要使用它完成的任务。
以下是一个示例:C# Read Text File Containing Data Delimited By Tabs请注意ReadLine()
和WriteLine()
语句。
TextBox受其可容纳的字符数严重限制。您可以尝试在RichTextBox
上使用AppendText()
方法。
答案 3 :(得分:2)
首先使用富文本框而不是常规文本框。对于您正在使用的大量数据,它们要好得多。但是,您仍然需要读取数据。
// use a string builer, the += on that many strings increasing in size
// is causing massive memory hoggage and very well could be part of your problem
StringBuilder sb = new StringBuilder();
// open a stream reader
using (var reader = new StreamReader(@"C:\Test.txt"))
{
// read through the stream loading up the string builder
while (!reader.EndOfStream)
{
sb.Append( reader.ReadLine() );
}
}
// set the text and null the string builder for GC
textBox1.Text = sb.ToString();
sb = null;