最近遇到一个头痛的事情:有一个文本文件有大约200M,一共有1千多万条数据。数据结构比较简单,一共就是三列,id、name、value。想点击某个按钮将这些数据load到内存中。现在的实现是使用Open App.Path + "\resource\level1007.dat" For Input As #1的方式,每读取一行,进行split,然后存到一个自定义的type中,最后形成一个type的数组。测试了一把,这种读取文件的方法非常慢,也许是我的机器不好,将这些数据全部load到内存中花了5个多小时!!请各位大侠拉兄弟一把。

解决方案 »

  1.   

    你的目的是什么?把这个文件内容存放到数据库中去吗?建议:
    文本文件-》数据库-》建立多级索引-》用Select语句从数据库中提取出若干条数据为一批,然后一批一批读,一批一批显示因为数据库中组织数据比文本文件效率高得多了
      

  2.   


    1 不要试图一次读取所有数据。实际上,这样庞大的数组,也会引起虚拟内存的磁盘交换。2 可以将文本文件直接作为数据库来处理,可以用 DAO 或 ADO。Jet 引擎所支持的外部数据库格式包括文本格式。在数据文件同一路径下,创建一个 Schema.ini 文件(内容根据你实际情况调整):[level1007.dat]ColNameHeader=TrueFormat=TabDelimitedMaxScanRows=0CharacterSet=ANSICol1=KEY Char Width 6Col2=Char Width 50Col3=HIGH Float Width 6------------------------------Dim db As DAO.Database, rs As DAO.RecordsetSet db = OpenDatabase(Name:=App.Path + "\resource\level1007.dat", _
                                    Exclusive:=True, _
                                    ReadOnly:=True, _
                                    Connect:="TEXT")Set rs = db.OpenRecordset("SELECT * FROM level1007")
      

  3.   

    只要你的内存够大,当然可以一次读取了//每读取一行,进行split
    一行一行读,当然慢要充分利用磁盘与内存的直接交换
    Open App.Path + "\resource\level1007.dat" For Input As 1
    str1 = Strconv(InputB$(LOF(1), 1), vbUnicode)
    close 1
    先用vbCrLf分割得到每一行
      

  4.   

    用二进制方式打开,每次读到Byte数组缓冲区,是最快的,就是比较麻烦
      

  5.   

    viena(维也纳nn-实心木头人) 兄提到的方法报错了。
    Dim str1 As Variant
        On Error GoTo ErrorHandler
        Open App.Path + "\resource\level1007.dat" For Input As #1
        str1 = StrConv(InputB$(LOF(1), #1), vbUnicode)
        Close #1
        
        Exit Sub
    ErrorHandler:
        showMessage "error=" + Str(Err.Number)
        Close #1Err.Number=7
    是不是内存不够啊?
      

  6.   

    主要看后期准备如何处理。如果是准备显示在窗体上,完全可以先少量加载一些行,然后根据需要再选择性加载。
    如果是做统计,转换到 sql server 再处理会快很多。一次性在内存中处理1000多万行不现实,完全可以用根据需要以技巧来避开。