u011503573
TJ-King
采纳率75%
2015-04-10 03:30

菜鸟求教!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分钟才能处理完

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 复制链接分享
  • 邀请回答

8条回答

  • caozhy 回答这么多问题就耍赖把我的积分一笔勾销了 6年前

    难怪代码慢,你还用了字符串相加。

    你应该用 StringBuilder 代替直接连接字符串。

    另外我说了,ReadLine效率非常低。

    点赞 评论 复制链接分享
  • bdmh bdmh 6年前

    用内存映射+线程
    Net 4.0中引入了System.IO. MemoryMappedFiles

    点赞 1 评论 复制链接分享
  • blogtjf 宇峰科技 6年前

    哦哦。。。。。学习了。。。。

    点赞 评论 复制链接分享
  • starfd 娃都会打酱油了 6年前

    原来不止是单线程,还因为你在不停的组织字符串,导致GC释放内存

    点赞 评论 复制链接分享
  • u011503573 TJ-King 6年前

    while ((readstr = sr.ReadLine()) != null)
    {
    if (readstr.StartsWith("RAPID"))//速度标记
    {
    strtemp = readstr + "\r\n";
    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 + "\r\n";
    strtemp += mystr;
    mystr = strtemp.Replace(" ", " ");
    mystr = mystr.Replace(" ", " ");
    }
    progressBar1.Value++;

                }
    
    点赞 评论 复制链接分享
  • caozhy 回答这么多问题就耍赖把我的积分一笔勾销了 6年前

    不要用 StreamReader.ReadLine() 方法整行读,这个时间全部浪费在IO上了,应该用内存映射文件或者分块读。

    点赞 评论 复制链接分享
  • bdmh bdmh 6年前
    点赞 评论 复制链接分享
  • Tiger_Zhao Tiger_Zhao 6年前

    C# 啊,用 StreamReader.ReadLine() 方法整行读,解析出3个值,再用 StreamWriter.WriteLine() 方法整行写。
    100M都不用7分钟吧。你写的程序绝对是差到家了。

    点赞 评论 复制链接分享