none
为什么用StreamReader类读文件很慢????? RRS feed

  • 问题

  •      代码如下,就这读一个25000行要7~8分钟,读689k 50000行都不行!  请大家帮我看看是什么原因???
    同时请大家指点一下怎么用 BufferStream 类?能否提高效率(能读10M文件)?能否一次读一行?
      
             Dim StrReadLine As String
             Dim streamReader As System.IO.StreamReader = New System.IO.StreamReader(FileName,        
                                                                                   System.Text.Encoding.ASCII, True, 5 * 1024 * 1024)
          
      '     streamReader = My.Computer.FileSystem.OpenTextFileReader(FileName)
        

            Do

                StrReadLine= streamReader.ReadLine          
                RichTextBox1.Text &= StrReadLine & vbCrLf 

            Loop Until StrReadLine is Nothing

            streamReader.Close()

    2009年3月15日 9:30

答案

  • 你好!
         BufferedStream不适合这样的场景,一般用于NetStream类来减少网络访问的次数!
         你要加载这么大的文件不可能太快,这种情况越缓冲就越慢!

         建议:

         1,你就像现在这样一行一行的读文本,然后你使用RichTextBox的AppendText来一行一行追加文本,这样一行一行的呈现给用户。
         2,使用ReadToEnd方法全部读出,然后再一起呈现给用户!为避免用户等待可以显示一个进度条!
         3,考虑分页,只读取一页呈现给用户,当他想看其他页的时候再读取一页!
         关键看你的应用需要什么样的效果了
     

    周雪峰
    2009年3月15日 10:57
    版主
  • 你试试ReadToEnd方法,应该快一些! 
    周雪峰
    2009年3月15日 14:26
    版主

全部回复

  • 你好!
         BufferedStream不适合这样的场景,一般用于NetStream类来减少网络访问的次数!
         你要加载这么大的文件不可能太快,这种情况越缓冲就越慢!

         建议:

         1,你就像现在这样一行一行的读文本,然后你使用RichTextBox的AppendText来一行一行追加文本,这样一行一行的呈现给用户。
         2,使用ReadToEnd方法全部读出,然后再一起呈现给用户!为避免用户等待可以显示一个进度条!
         3,考虑分页,只读取一页呈现给用户,当他想看其他页的时候再读取一页!
         关键看你的应用需要什么样的效果了
     

    周雪峰
    2009年3月15日 10:57
    版主
  •    多谢周兄指点,我这里只是测试以下用StreamReader 能不能提高读入文件的速度,结果比Input(,)函数慢多了--用它3M的文件也30秒左右处理完。

      我读入一行并不仅仅显示,还要分析,提取一行中的数据!

    希望能够处理更大的文件所以需要提高读入文件的速度!初步想先把文件读入内存,这样减少IO操作可以提高速度。     --------------希望找到更好的方法能够快速处理10M的文件!
    2009年3月15日 11:51
  • 你试试ReadToEnd方法,应该快一些! 
    周雪峰
    2009年3月15日 14:26
    版主
  • 我刚才测试了一下,读取一个15M多一些的文件只花了2-3秒左右,你试试! 
    周雪峰
    2009年3月15日 14:57
    版主
  •  那我上面的代码有问题?如果有是读文件有问题,还是  RichTextBox1.Text &= StrReadLine & vbCrLf  添加文本有问题?
    2009年3月16日 4:29
  •  RichTextBox1.Text &= StrReadLine & vbCrLf 

    这个操作太慢了 
    每一次至少造成两个 string 片断被扔入垃圾回收
      
    请用 stringbuild 拼出一个string 以后   把结果最后放入 textbox
    热烈庆祝进入4星活跃用户队伍
    有原则的回答问题: 不懂的不去装懂,别人回答得很完整的,没有需要补充的不去蹭分。
    2009年3月16日 5:16
  •  RichTextBox1.Text &= StrReadLine & vbCrLf

    第一步 

    开辟一个新空间  string  长度   len (StrReadLine )  +len (RichTextBox1.Text)

    第二步

    RichTextBox1.Text 拷贝入新空间

    第三步

    StrReadLine  拷贝入新空间

    第四部
    新空间放入RichTextBox1.Text


    第五步

      放弃 StrReadLine 和原来的 RichTextBox1.Text

    热烈庆祝进入4星活跃用户队伍
    有原则的回答问题: 不懂的不去装懂,别人回答得很完整的,没有需要补充的不去蹭分。
    2009年3月16日 5:19
  • 我感觉是一行一行读比较慢,另外你设置Text属性那行最好使用Append,你那样写比较浪费内存! 
    周雪峰
    2009年3月16日 15:33
    版主