1.开A线程把文本一行行读出来,把每20个一组放到一个集合里。
2.开n个B线程不停的从集合里取一组,再删除这组数据,执行sql:in(.....),返回结果判断如果不存在,保存到数据库里的另一个表里。如果表数据不多这么搞速度应该不错。
如果表数据太多,就拆分,办法也有。

解决方案 »

  1.   

    我觉得,先将文本文件的数据插入到临时表(用存储过程进行插入的话,500W数据大概要3-5分钟),然后再去通过sql语句取出相同的部分,至于取出来之后怎么用就看楼主的了
      

  2.   


    什么数据库?如果是Oracle的话,直接用SQL Loader把560W数据装入数据库,接着建立索引,最后剩下的就是一句Select的问题了。
    借助数据库来完成大数据集运算,总体性能应该是最好的。程序处理的话,因为你文本文件每行数据并非定长,所以想搞什么并行计算也很麻烦,基本上就只能顺序处理。相当于要进行560W次的数据库检索,虽然有索引的情况下单词检索性能极高,但是估计也要跑个半天。大致方法如下:
    1、数据库表中能对应文本的列,建立索引;
    2、BufferReader + FileReader打开文件,每次readLine;
    3、Select 数据库表看是否存在该行记录(有索引的情况下都是毫秒级执行),没有则写入另一个文件(记录所有不在表中的记录);
    4、循环处理下一行。
    为了尽量消除网络开销,程序如果能直接在数据库服务器上执行最好。
      

  3.   

    可以考虑用key-value这样的数据库去封装下。然后再查询比较
      

  4.   

    把文本中的数据对比字段,导入到数据里。然后用sql语句做关联查询。
      

  5.   


    什么数据库?如果是Oracle的话,直接用SQL Loader把560W数据装入数据库,接着建立索引,最后剩下的就是一句Select的问题了。
    借助数据库来完成大数据集运算,总体性能应该是最好的。
    程序处理的话,因为你文本文件每行数据并非定长,所以想搞什么并行计算也很麻烦,基本上就只能顺序处
    理。相当于要进行560W次的数据库检索,虽然有索引的情况下单词检索性能极高,但是估计也要跑个半天。大致方法如下:
    1、数据库表中能对应文本的列,建立索引;
    2、BufferReader + FileReader打开文件,每次readLine;
    3、Select 数据库表看是否存在该行记录(有索引的情况下都是毫秒级执行),没有则写入另一个文件(记录所有不在表中的记录);
    4、循环处理下一行。
    为了尽量消除网络开销,程序如果能直接在数据库服务器上执行最好。
    这个思路可行!
      

  6.   

    500W 记录对于现代数据库来说实在算不上大事。用几个临时表,很快就解决了。
    假设原始数据库在这两个表中: tab01, tab02;可建立以下临时工作表:tmp00, tmp_total-- 建立索引以提高后面的汇总速度
    Create Index i01tmp ON tab01(uid);
    Create Index i02tmp ON tab02(uid);-- 拷贝tab01 中的记录,去掉重复值
    Insert into tmp00 (uid, flag) Select uid, 1 From tab01 Group by uid;-- 拷贝tab02 中的记录,去掉重复值
    Insert into tmp00 (uid, flag) Select uid, 2 From tab02 Group by uid;-- 建立索引以提高后面的汇总速度
    Create Index i00tmp ON tmp00(uid);-- 分组汇总
    Insert into tmp_total ( uid, flag ) Select uid, sum(flag) From tmp_all Group by uid;-- 根据flag字段的汇总值可分3类情况-- 找出仅存在于tab01 中的uid值
    Select uid From tmp_total Where flag=1;-- 找出仅存在于tab02 中的uid值
    Select uid From tmp_total Where flag=2;-- 找出两个表的交集部分
    Select uid From tmp_total Where flag=3;