欲达到的效果:
目录下有300个近20兆的文本数据,想将分成4个一组,存入数组中运算,现在的代码速度不行,敬请斧正~附供改正源码(1组4个文本的单循环)如下:假设程序目录下有待存入数组的文本4个,名称分别为: 1.txt    2.txt     3.txt     4.txt   
Option ExplicitSub bj()
 Dim I As Double, j As Double, k As Double, l As Double, n As Double, p As Double
 
 Dim tp As Double, kp As Double, mp As Double   
 Dim index As Double
 
 Dim fourjh() As Double   '1次提取4个文本的并集数组
 
 Dim js() As Long Dim filetxt As String, x As Variant
ReDim js(1 To 4)For mp = 1 To 4
 
 '求得文本文件行数 filetxt = String(FileLen(App.Path & "\" & mp & ".txt"), " ")
 Open App.Path & "\" & mp & ".txt" For Binary As #1
 Get #1, , filetxt
 Close 1
 
 x = Split(filetxt, vbCrLf)
 
 
 If mp = 1 Then
 
 js(mp) = UBound(x)
 
 Else
 
 js(mp) = js(mp - 1) + UBound(x)
 
 End If
 
 
 If mp = 1 Then
 
 ReDim fourjh(1 To UBound(x))
 
  For I = 1 To UBound(x)
  
    fourjh(I) = Val(x(I - 1))
    
  Next I
  
 Else
 
 ReDim Preserve fourjh(1 To js(mp - 1) + UBound(x))
  
  For I = 1 To UBound(x)
  
    fourjh(js(mp - 1) + I) = Val(x(I - 1))
    
  Next I End If
  
 Next mp
 
 
End Sub您费心...俺在线恭候

解决方案 »

  1.   

    vbman2003,你来了,上次多谢你的帮助,近来可好...文本数据,转换成什么样的数据库比较方便?另:想用copymemory替代循环,总是出错,有劳你指点一下
      

  2.   

    你这样,会使用PC的CPU利用率狂低,,记住:让CPU干N多的循环,是CPU利用率最低的一种表现形式存储数据还是建议让数据库干,至于你说到的在整合数据,我想这个问题,应该在数据存入的时候就应该考虑的问题,而不是取出数据再来思考,这么多数据如何整合,好好设计一下数据库.你上面的代码,再怎么优化,也优化不到哪里去,操作文本文件中的数据,一万年不变的是要去一行行的读取数据,如果一个文本文件里面有10万行,那么你的代码就会循环10万次,有这必要吗???所以LZ您的问题,不是算法的问题,而是对这个问题的思路问题!
      

  3.   

    合并成数组的目的是什么?为什么要进行这样的运算呢?保留数组的数据在Redim的时候很邪恶...VB的数组太大了,对于内存是个比较恐怖的事情...FileSystemObject,TextStream替换你的写法,会有些提升,但是这不是效率的关键..
      

  4.   

    下面是我测试用copymemory的代码,想提高点速度,奇怪的是,应该复制270多万的数据,总是前10万个左右有数据,后面的全部是0,烦请各位指点一下:  
    Option Explicit
    Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Double, Source As Double, ByVal Length As Long)
    Sub bj6() Dim I As Double, j As Double, k As Double, l As Double, n As Double, p As Double
     
     Dim tp As Double, kp As Double, mp As Double
     
     Dim ntw() As Double
     
     Dim index As Double
     
     Dim fourjh()  As Double   '1次提取4个文本的并集
     
     Dim js() As LongDim filetxt As String, x As Variant
    ReDim js(1 To 4)For mp = 1 To 4
     
     '求得文本文件行数 filetxt = String(FileLen(App.Path & "\" & mp & ".txt"), " ")
     Open App.Path & "\" & mp & ".txt" For Binary As #1
     Get #1, , filetxt
     Close 1
     
     x = Split(filetxt, vbCrLf)
     
     ReDim ntw(1 To UBound(x))
     
      For I = 1 To UBound(x)
      
        ntw(I) = Val(x(I - 1))
        
      Next I
     
     
     If mp = 1 Then
     
     js(mp) = UBound(x)
     
     Else
     
     js(mp) = js(mp - 1) + UBound(x)
     
     End If
     
     
     If mp = 1 Then
     
     ReDim fourjh(1 To UBound(x))
     
     CopyMemory fourjh(1), ntw(1), UBound(x) Else
     
     ReDim Preserve fourjh(1 To js(mp - 1) + UBound(x))
     
     CopyMemory fourjh(js(mp - 1) + 1), ntw(1), UBound(x)
      
     End If
      
     Next mp
     
     
    End Sub
      

  5.   

    如果不能修改到数据库中,那还是考虑用控件吧.1.可能会省下较多运算的"功夫".
    2.可以使用进度条,可以增强交互.
    3.数组redim也不用了,减少了copy内存的操作.
    4.甚至一些控件会专门提供读取文本文件的方法,也可能免去了你的逐行读取的问题.
      

  6.   

    我的博客里有针对类似问题的东西:
    http://blog.csdn.net/KiteGirl/archive/2008/12/19/3554669.aspx这个东西的功能是:
    1、给文本文件建立索引信息,获取文本文件中所有行分隔符的地址。
    2、根据这些索引信息可以直接取任意位置、任意行(从文件指定地址取指定数量字节)。
    3、这个东西建立索引数据的时候,对文本文件操作是一小片、一小片地进行,而不是一次读入内存。
    4、如果你的文本文件不被修改,只需要建立一次索引。建立索引的速度非常快,甚至每次重新建立的速度你都可以接受。
      

  7.   

    出差了几天,没有及时回复,见谅!
    谢谢楼上诸位,虽然问题没解决,但至少知道了大量的文本读写有速度慢的缺陷...TO KITEGIRL(小仙妹):
    博客的文章拜读了,给文本加索,使之可以象数据库一样进行操作是一件很有价值的事!可惜目前用不上,只有先珍藏了...