本帖最后由 bcrun 于 2014-08-06 09:33:16 编辑

解决方案 »

  1.   

    Access 有 LIKE 操作符可以判定字符串的包含,你有必要把子串单独拆出了吗?
    多次一举!
      

  2.   

    like后的字符串还不是要单独拆出来?再说是两两匹配,两字符串搭配就有900多种,900*400w*400w就是天文数字
      

  3.   

    400w条字符串,每字符串有40个字符,现要求:如果任意两字符串的公共子字符串的长度超过10,就输出。每字符串可以分为31个子串,也就第一个字符串要循环31次like,才能判断它与其他字符串是否有公共子字符串,就是这个like上个星期把我的硬盘搞烂了,除非有什么好的算法.
      

  4.   

    没有什么好说的。
    要么靠足量的硬件资源实现,
    要么靠算法优化:先手工做数据分布分析,能否做无关联的快速预判;然后设计一个和 KMP 一样能提升速度的匹配算法。
      

  5.   

    记得几年前搞数据库程序较多时,像这种用insert into语句一条条慢慢插入的写法,执行速度是每秒百条级的。虽然现在年代不同了,硬件更新换代了,但也不过就几千上万条一秒吧。所以,一般巨量数据导入都是要用专门的导入工具的。比如说MSSQL的DTS.
      

  6.   

    1.2亿一次性用 Access 处理,建索引都很慢。
    考虑分治法。数值子串约1亿个,10位数取值范围有为100亿。
    用前4位数字分组,那么就是1万组。
    同组数字的前4位一致,所以只要存后6位,可以直接用整数类型了。
    组的数据可以用二进制文件存储,每个记录就是2个Long,8字节,可以用文件长度除8得记录长度。
    比如你得到序号333的子串1234567890,就在组文件 1234.dat 中添加 (567890,333) 记录。
    平均每组是1万子串,如果太多,可以对组再拆分。

    每个组的数据,其实可以用抽屉法判重复。100万Long型(序号)的数组不到4M。数值子串约1200万,可以用前1、2位字符分组。
    只要分组数据不大,字符串判重复可以用交给数据库。