当前位置: 代码迷 >> C# >> 请问!c#大文本处理怎么提速?可能几百兆
  详细解决方案

请问!c#大文本处理怎么提速?可能几百兆

热度:31   发布时间:2016-05-05 04:12:22.0
请教!c#大文本处理如何提速?可能几百兆
小弟在做一个文件转换的程序,需要将CLI文件转换成SRC文件。
CLI文件内容如下:
$$LAYER/0.42 
$$HATCHES/1 422     -14.861 -23.177 -14.255 -23.177 -13.234 -23.077 -15.161 -23.077 -15.461 -22.977 
要转换成
LIN {E6POS: X -14.861, Y -23.177, Z 0.42, A 0.000, B 0.000, C 0.000, E1 0.000} C_VEL
LIN {E6POS: X -14.255, Y -23.177, Z 0.42, A 0.000, B 0.000, C 0.000, E1 0.000} C_VEL
功能已经实现了,关键是小文本还可以,处理大文本时速度就非常慢了,1M的文件都要处理7分钟。我用的是streamread读取,速度还算可以,处理的时候试过两种方法:一个是读一行判断一行处理一行,一个是全读出来放到数组再处理。两方法速度都很慢
小弟菜鸟一个,还希望各位前辈能够指点。
------解决思路----------------------
你最好是一部分一部分处理,把大文件分成几个部分,每个部分处理时先读入内存,再按照你的方法进行处理,注意,处理过程中不要写盘,最好是将结果放到另一块缓冲区中,等处理完这一部分再写入保存,这样处理速度应该很快的,我原来处理数据文件都是这样做的,很快的,另外,你的处理过程也应该优化一下,保证速度
------解决思路----------------------
引用:
在运行时检查你的windows性能,查看cpu利用率。如果大多数时候都是空闲的,那么就说明你的程序的cpu利用率不高,说明你的程序的瓶颈应该是在I/O等其它方面,这时候就可以将你的算法改为并发多线程的。

而如果cpu利用率已经很高了,那么并行化也不会有太好的改进。

如果cpu占用率很高,如果还要加快处理速度,就只能开始去考虑分布式处理了。

你的建议非常正确,但该提问者可能不能从中得益。因为该贴附上代码中可能有大量低效的操作,造成高CPU或高IO。

引用:
...我用的是streamread读取,速度还算可以...

建议楼主自己研究回答三个问题:
1、你用到那些streamread的优点。
2、你代码中该行做了些什么:progressBar1.Maximum = sr.ReadToEnd().Split('\n').Length;
3、这种字符串处理有什么副作用:strtemp += mystr;  mystr = strtemp.Replace("  ", " ");

------解决思路----------------------
要想提高效率, 就不要用那么用字符串处理操作了, 至少应该用 StringBuilder , 最好用 byte 数组, 甚至是不安全的指针
------解决思路----------------------
内存映射可以处理大文件
------解决思路----------------------
用内存映射文件。
------解决思路----------------------
这种代码一看风格就知道是刚刚培训结束、刚到公司实习的学生写的。我在#5楼的回复主要针对#2楼4#楼的回复而跟贴,应该看到这个前提,我能够讨论的重点也许不在原作者。

对于作者来说,我只能告诉他如何收敛他的判断范围,而不是猜问题出在哪里。这在某种意义上,就跟让他自己“回答某个语句的优点”的回复是一样的结果,都是不能直接抄到答案的。