500W数据去重复
有个文本文档,里面一行是一条数据,大概有560多W条,数据库有张表,有一列对应文本的数据,怎么找出文本文档里面有,数据库却没有的数据
------解决方案--------------------好大的文件……这样数据库也要很大吧
------解决方案--------------------写个程序吧 你可以吧文本文件一行一行的读出来,每读一行查一次数据库,看看是否有,没有你就把这行文本写到另一个文件,也可以写到数据库。
------解决方案--------------------先读出来 然后去掉重复 我去..好多信息..
------解决方案--------------------有个思路,不知可不可行。
1.把数据库里的数据读出来存到文件里(能排序最好,不能也无所谓)。
2.对数据库导出的文件(如果没有排序)和原有文本文件用相同的方式排序分别生成新的文件(这么大的数据量排序可以用外排序的方式实现)。
3.对2中生成的两个排序好的文件逐行判断(这个操作大学数据结构里应该学),这样做耗费的时间应该不多。
------解决方案--------------------1.开A线程把文本一行行读出来,把每20个一组放到一个集合里。
2.开n个B线程不停的从集合里取一组,再删除这组数据,执行sql:in(.....),返回结果判断如果不存在,保存到数据库里的另一个表里。
如果表数据不多这么搞速度应该不错。
如果表数据太多,就拆分,办法也有。
------解决方案--------------------我觉得,先将文本文件的数据插入到临时表(用存储过程进行插入的话,500W数据大概要3-5分钟),然后再去通过sql语句取出相同的部分,至于取出来之后怎么用就看楼主的了
------解决方案--------------------不要用程序了,用数据库处理吧,把文本信息存到另一个表里。用数据库去操作比较
------解决方案--------------------
什么数据库?如果是Oracle的话,直接用SQL Loader把560W数据装入数据库,接着建立索引,最后剩下的就是一句Select的问题了。
借助数据库来完成大数据集运算,总体性能应该是最好的。
程序处理的话,因为你文本文件每行数据并非定长,所以想搞什么并行计算也很麻烦,基本上就只能顺序处理。相当于要进行560W次的数据库检索,虽然有索引的情况下单词检索性能极高,但是估计也要跑个半天。大致方法如下:
1、数据库表中能对应文本的列,建立索引;
2、BufferReader + FileReader打开文件,每次readLine;
3、Select 数据库表看是否存在该行记录(有索引的情况下都是毫秒级执行),没有则写入另一个文件(记录所有不在表中的记录);
4、循环处理下一行。
为了尽量消除网络开销,程序如果能直接在数据库服务器上执行最好。