c#读取大容量txt文件,如何降低cpu利用率 我估计啊,CPU占用率高是因为你把数据放到了UI了,UI大量刷新,所以CPU比较累。你试试先不放到UI上,再看看效果。遇到这种问题先尝试分解问题,然后逐个解决。一定要先找到瓶颈所在。 解决方案 » 你说的几秒自动读取一次,是从头读还是只读取新Log的内容?可以考虑单开一个线程,负责读取、处理数据,之后把结果传给UI,再由UI添加,可能会好些。 log 文件内容是追加进去吗? 如果是,当 StreamReader 读取完之后,记录下 StreamReader.BaseStream.Position 属性的值,下次读取时,把记录的值反赋回去,这样从上次的结束点开始读,不重复读之前的 同意,顶!!!另外文本读取的时候,如果效率低也要从代码上找找问题,如果能优化就有话,如果涉及到字符串拼接是不是要用stringbuilder,怎么减少循环次数等等都需要再考究。 每次读取几k到缓存,然后thread.sleep,操作完再读 我觉得这个做法不错,多谢,我回去试试,log文件的内容是追加进去的,是一个web系统不断向这里写日志,但我目前是每隔几秒完全重新读取一次,比较笨,,, ,等明天上班我按照你说的试试 我用的这个代码,16M的txt,大概是6秒 private void btnRead_Click(object sender, EventArgs e) { //HiPerfTimer hpt = new HiPerfTimer(); //hpt.Start(); //线程每次读取文件100K const long ChunkSize = 102400; //清理非托管不受GC控制的资源,using结束后会隐式的调用Disposable方法 using (OpenFileDialog fbd = new OpenFileDialog()) { fbd.Filter = "文本文件|*.txt"; if (fbd.ShowDialog(this) == DialogResult.OK) { byte[] bytcontent = new byte[ChunkSize]; FileStream fs = new FileStream(fbd.FileName, FileMode.Open); //获取文件总大小 long dataLengthToRead = fs.Length; while (dataLengthToRead > 0) { //读取的大小 int lengthRead = fs.Read(bytcontent, 0, Convert.ToInt32(ChunkSize)); Thread t = new Thread(new ParameterizedThreadStart(Readfile)); t.Start(System.Text.Encoding.Default.GetString(bytcontent)); dataLengthToRead -= lengthRead; } } } //hpt.Stop(); //MessageBox.Show((hpt.Duration/1000).ToString()); } public delegate void Callback(string str); private void Readfile(object content) { if (richTextBox1.InvokeRequired) { Callback call = new Callback(Readfile); this.BeginInvoke(call, new object[] { content }); } else { this.richTextBox1.AppendText(content.ToString()); this.richTextBox1.AppendText("\r\n"); } } 通常每个套接字地址(协议/网络地址/端口)只允许使用一次 怎么判断一个Treeview中是否有节点选中? 使用事件+委托和直接用方法有什么区别? dataset.tables[0].row[].itemarray[0] 错误,帮忙解决!! 同志们:我记得有一个设置,可以让提交后页面的竖滚动条自动滚动到提交前的位置,是什么来着... 图片插入读取数据库代码 如何用javascript动态添加行 汉字的编码是在哪个范围? 急救! 怎么在当前输入框粘贴文本? socket keep alive问题 gridview的PagerTemplate 不显示内容
可以考虑单开一个线程,负责读取、处理数据,之后把结果传给UI,再由UI添加,可能会好些。
另外文本读取的时候,如果效率低也要从代码上找找问题,如果能优化就有话,如果涉及到字符串拼接是不是要用stringbuilder,怎么减少循环次数等等都需要再考究。
我觉得这个做法不错,多谢,我回去试试,log文件的内容是追加进去的,是一个web系统不断向这里写日志,但我目前是每隔几秒完全重新读取一次,比较笨,,, ,等明天上班我按照你说的试试
{
//HiPerfTimer hpt = new HiPerfTimer();
//hpt.Start(); //线程每次读取文件100K
const long ChunkSize = 102400;
//清理非托管不受GC控制的资源,using结束后会隐式的调用Disposable方法
using (OpenFileDialog fbd = new OpenFileDialog())
{
fbd.Filter = "文本文件|*.txt";
if (fbd.ShowDialog(this) == DialogResult.OK)
{
byte[] bytcontent = new byte[ChunkSize];
FileStream fs = new FileStream(fbd.FileName, FileMode.Open);
//获取文件总大小
long dataLengthToRead = fs.Length; while (dataLengthToRead > 0)
{
//读取的大小
int lengthRead = fs.Read(bytcontent, 0, Convert.ToInt32(ChunkSize));
Thread t = new Thread(new ParameterizedThreadStart(Readfile));
t.Start(System.Text.Encoding.Default.GetString(bytcontent));
dataLengthToRead -= lengthRead;
}
}
} //hpt.Stop();
//MessageBox.Show((hpt.Duration/1000).ToString());
} public delegate void Callback(string str); private void Readfile(object content)
{
if (richTextBox1.InvokeRequired)
{
Callback call = new Callback(Readfile);
this.BeginInvoke(call, new object[] { content });
}
else
{
this.richTextBox1.AppendText(content.ToString());
this.richTextBox1.AppendText("\r\n");
}
}