问题描述
- 菜鸟求教!C#大文本处理如何提速?
-
有个几百兆的文件,里面全是数据,每一行都要处理,如:
GOTO / 8.39900, -4.61009, 115.00000
要转换成
LIN {E6POS: X 8.39900, Y -8.37946, 115.00000, A 0.000, B 0.000, C 0.000, E1 0.000} C_VEL现在是小文件可以,数据量大了速度就非常慢,1M的都要7分钟才能处理完
解决方案
难怪代码慢,你还用了字符串相加。
你应该用 StringBuilder 代替直接连接字符串。
另外我说了,ReadLine效率非常低。
解决方案二:
用内存映射+线程
Net 4.0中引入了System.IO. MemoryMappedFiles
解决方案三:
C# 啊,用 StreamReader.ReadLine() 方法整行读,解析出3个值,再用 StreamWriter.WriteLine() 方法整行写。
100M都不用7分钟吧。你写的程序绝对是差到家了。
解决方案四:
之前的要引用api函数
http://www.cnblogs.com/criedshy/archive/2010/06/13/1757826.html
解决方案五:
不要用 StreamReader.ReadLine() 方法整行读,这个时间全部浪费在IO上了,应该用内存映射文件或者分块读。
解决方案六:
while ((readstr = sr.ReadLine()) != null)
{
if (readstr.StartsWith("RAPID"))//速度标记
{
strtemp = readstr + "rn";
strtemp += mystr;
mystr = strtemp;
}
else if (readstr.StartsWith("GOTO"))//坐标转换(插入、替换字符)
{
strtemp = readstr;
strtemp = strtemp.Replace("GOTO /", "LIN {E6POS: X");
strtemp = strtemp.Insert(strtemp.IndexOf(',') + 1, " Y");
strtemp = strtemp.Insert(strtemp.LastIndexOf(',') + 1, " Z");
strtemp += lastaddstr + "rn";
strtemp += mystr;
mystr = strtemp.Replace(" ", " ");
mystr = mystr.Replace(" ", " ");
}
progressBar1.Value++;
}
解决方案七:
原来不止是单线程,还因为你在不停的组织字符串,导致GC释放内存
解决方案八:
哦哦。。。。。学习了。。。。