现在有4万条左右的记录Tab1,strVal01字段中大概有1万个[]括起来的字符串,用Tab2中strVal02和Tab1中strVal01一一比较。目前的问题是速度问题。(大家给个算法就行,如果被采纳,单独再给100)
Tab1具体如下:
ID  strVal01
1  [1,2][1,3][x,y]...[10000,10000]
2    [1,2][1,3][x,y]...[10000,10000]
3    [1,2][1,3][x,y]...[10000,10000]
...    ....
399999  ...
400000 ....Tab2:
strVal02
strTemp01
strTemp02
strTemp03
...
strTemp10000

解决方案 »

  1.   

    比较什么我觉得都没关系,所以没写。下面是一个具体的例子。strVal02  中都是一些表达式。来判断strVal01中是否正确
    strval01的格式是一个坐标对应一个值,如:[1,2][3][2,3][0][3,4][4]
    比如:strTemp01=[1,2]>2 and ([2,3]=0 or [3,5]>2)比较的过程:
    我会把strTemp01中的坐标转换成strVal01中的对应的值,然后再用ScriptControl运行得到一个Ture或False
      

  2.   

    这个我认为没有更好的方法了,只能一条一条的对比,因为无法用SQL语言实现。
    把两个表的内容先读取到内存中,可能会快一些,但都没有太大的效果。
      

  3.   

    大家帮忙再想一想-------
    www.vicmiao.com
    努力就有美好时光!
      

  4.   

    1:取出 两表的所有记录 存放内存中ds1,ds2
    2: 循环ds2 数据,循环中用ds1.select(“exc”) 形成 DataRow[] 很多满足条件的行, 因为它不操作数据库,直接从内存中找的
    3:exc表达式需要优化:一定要写成:把=比较的写在最前面,比数字的写在其次前面 or 最费时间
      

  5.   

    存储过程也应该考虑下
    毕竟性能要比sql好上很多
      

  6.   

    先把条件说清楚:
    1 你的记录以什么方式保存的?是数据库?还是文本文件?
    2 Tab2 中用于比较的只有一条记录吗?如果是数据库,从现在表述的情况理解,似乎可以:
    "Select * From Tab1 Where strVal01 = '" & strVal02 & "'"
      

  7.   

    哦 忘记了
    你的是用js Enginee做的
    必须要先连接成字符串
    然后run 才能返回true false
      

  8.   

    strVal01一一比较==========这个是说对于对一行, 用strVal01的值来计算strVal02的表达试, 重复4W次还是说用strVal02的没一行的值, 参与整个表1的strval01的值, 并且表1的
    所有的记录的strval01拆分出来的坐标不重复。
      

  9.   

    如果是在tab2 里面的一条记录就要在TAB1里面循环40000次的话
     整个运行下来至少进行40000* 10000
      如果在tab1里面先排序的话,这个排序也是需要时间,同样消耗时间
      

  10.   

    先将Tab2中的格式转换成Tab1中的格式,即[]包起来的部分,并将其数据放置在一个表中。然后进行SQL对比,这样速度会快一些。不要在比较时使用运算,这样会很慢。一个40K的数据更新应该是很快的,慢主要在计算后进行对比。
      

  11.   

    今天忙了一天,才有时间上来看。ZOU_SEAFARER(国际海员) 说的是,不管怎么样一定要进行40000* 10000这么多次。只能从具体每个功能点上优化了。这个问题就这样吧。要接分的就快点行动。呵呵-----我在处理这个功能时发现一个问题,和大家一起讨论一下replace函数在处理大字符串时,速度很慢。Option Explicit
    Dim s As String
    Dim s1 As String
    Dim i As LongDim dblStart As Double
    Dim dblEnd As DoublePrivate Sub Form_Load()
    '生成测试字符串
    dblStart = Timer
    For i = 1 To 100000
        DoEvents
        s = s + "[" & i & "]"
    Next i
    dblEnd = TimerDebug.Print dblEnd - dblStartdblStart = Timer
    For i = 1 To 100000
        DoEvents
        '这里很费时
        s1 = Replace(s, "][", "|")
    Next i
    dblEnd = TimerDebug.Print dblEnd - dblStart
    End Sub
      

  12.   

    For i = 1 To 100000
        DoEvents
        s = s + "[" & i & "]"
    Next i============== 这当然慢, 因为内存的太频繁分配如果预先知道字符数量, 或者能大约推算出字符数量, 可先分配内存, 然后用mid函数
    能极快的提高速度
    同时, replace是vb中效率最高的函数之一, replace不需要执行多次。 一次就能全部替换
    下列2个timer的差加起来大概0.5秒左右.
    Private Sub Form_Load()
    '生成测试字符串
    Dim dblStart As Double
    Dim dblEnd As Double
    Dim s As String, s1 As String, pos As Long
    Dim i As Long
    dblStart = Timer
    s = Space(1000000)
    pos = 1
    For i = 1 To 100000
        DoEvents
        Mid(s, pos) = "[" & i & "]"
        pos = pos + Len("[" & i & "]")
    Next i
    s = Left(s, pos - 1)
    dblEnd = Timer
    Debug.Print dblEnd - dblStart
    dblStart = Timer
    For i = 1 To 1      'repleace只要操作一次
        DoEvents
        '这里很费时
        s1 = Replace(s, "][", "|")
    Next i
    s1 = Mid(s1, 2, Len(s1) - 2)dblEnd = Timer
    Debug.Print dblEnd - dblStartEnd Sub
      

  13.   

    1.http://support.microsoft.com/kb/170964/zh-cn
    2.如果你所用的字符有一定的格式,可以使用Split方法轉換成數組處理
    3.在同一個運算式時,晝量減少多個邏輯運算放在一起判斷,請改用單個單個單個階層判斷
      

  14.   

    4.注意類型的使用,能使用int類型,就不是使用單精度或雙精度及浮點數類型來定義變量,能使用char就不用使用string 
      

  15.   

    我这有一个很好的产品,看看能不能帮上大家啊.很好的解决方案啊大家值得讨论一下啊.
    OAOFFICE 文档控件,能够在浏览器窗口中直接编辑Word、Excel、Powerpoint、Viso、WPS等办公文档并保存到Web服务器上,实现了本地办公与网络办公的无缝整合,彻底解决了B/S模式下的电子政务/办公自动化等系统对常用Word、Excel等文档无法在线编辑的难题。除了在线编辑保存的基本功能外,SOAOffice 文档控件同时支持痕迹保留,手写签名,电子印章、数字签名、全文手写批注等高端电子政务、电子商务、办公自动化系统所必备的功能,是E-Government、E-Business和OA系统开发的最佳选择组件!
    有需要的朋友可加入MSN:[email protected] WWW.KENHANSOFT.COM
     联系方式:010-58696133/85349084 田小姐
      

  16.   

    我这有一个很好的产品,看看能不能帮上大家啊.很好的解决方案啊大家值得讨论一下啊.
    OAOFFICE 文档控件,能够在浏览器窗口中直接编辑Word、Excel、Powerpoint、Viso、WPS等办公文档并保存到Web服务器上,实现了本地办公与网络办公的无缝整合,彻底解决了B/S模式下的电子政务/办公自动化等系统对常用Word、Excel等文档无法在线编辑的难题。除了在线编辑保存的基本功能外,SOAOffice 文档控件同时支持痕迹保留,手写签名,电子印章、数字签名、全文手写批注等高端电子政务、电子商务、办公自动化系统所必备的功能,是E-Government、E-Business和OA系统开发的最佳选择组件!
    有需要的朋友可加入MSN:[email protected] WWW.KENHANSOFT.COM
     联系方式:010-58696133/85349084 田小姐
      

  17.   

    明白了你的需求。如何提高字符串转换的速度. 取决于两个方面:
    第一、字符串分析函数的效率。
    第二、通过下标定位值。其中问题2你需要一个二维矩阵,没有必要用数据库。至少表1没有必要。
    二维矩阵同样可以增,删,改,查,存,载。有关这部分就不在赘述。问题1. 
    extern int g_value_matrix[MAX][MAX];void trans_raw_string(char* inbuf, char* outbuf)
    {
            char* begin = inbuf;
            char tmp[256];
            char* row_str = NULL;
            char* col_str = NULL;
            int   row_val = 0;
            int   col_val = 0;        p = strchr(begin, "[");
            while(*p){
                    len = p - begin;
                    memcpy(outbuf+dcnt, begin, len);
                    dcnt += len;                // get row value
                    row_str = ++p;
                    p = strchr(p, ',');
                    *p = 0;
                    row_val = atoi(first_str);                // get col value
                    col_str = ++p;
                    p = strchr(p, ']');
                    *p = 0;
                    col_val = atoi(second_str);                // get value
                    value = g_value_matrix[row_val][col_val];                sprintf(tmp, "%d", value);
                    len = strlen(tmp);
                    memcpy(outbuf+dcnt, tmp, len);
                    dcnt += len;                begin = ++p;
                    p = strchr(begin, '[');
            }        strcpy(outbuf+dcnt, begin);
            outbuf[dcnt] = 0;        return dcnt;
    }
      

  18.   

    从编程语言角度来说,脚本语言和VB,sql语句 的速度是很慢的,比c/c++ 慢上很多。如果你会用使用c编程,那么用c编程应该可以提高速度。  从算法角度来讲,n 个记录逐个比较的复杂是n*n,这个算法太慢。可考虑hash算法。比如将table1中的数据建一个hash表。再用同样的hash函数对table2中的每个记录求key,如用key对应的字符串的个数不为0,则仅和这个key对应的多个字符串逐一比较即可,这个算法可大大提嵩速度。   前段时间看到一个在python 用hash 表处理重复字符串的文章。可参阅:http://www.shengfang.org/blog/p/0928suanfahash_map.php,或http://www.shengfang.org/blog/index.php?job=art&articleid=a_20070309_153055
      

  19.   

    >3.在同一個運算式時,晝量減少多個邏輯運算放在一起判斷,請改用單個單個單個階層判斷
    ===========================
    请教 a||b||c a&&b&&c 这样为什么不好
      

  20.   

    TO:pigsanddogs(我爱吃猪肉,但是长不胖,为什么??) 
    For i = 1 To 100000      'repleace只要操作一次
        DoEvents
        '这里很费时
        s1 = Replace(s, "][", "|")' 其实这里的s是100000个不同的字符串,这里为了测试用了一个
    Next i------
    这当然慢, 因为内存的太频繁分配如果预先知道字符数量, 或者能大约推算出字符数量, 可先分配内存----
    这个我试试,我觉得有道理。----
    谢谢大家。