1.开A线程把文本一行行读出来,把每20个一组放到一个集合里。
2.开n个B线程不停的从集合里取一组,再删除这组数据,执行sql:in(.....),返回结果判断如果不存在,保存到数据库里的另一个表里。如果表数据不多这么搞速度应该不错。
如果表数据太多,就拆分,办法也有。
2.开n个B线程不停的从集合里取一组,再删除这组数据,执行sql:in(.....),返回结果判断如果不存在,保存到数据库里的另一个表里。如果表数据不多这么搞速度应该不错。
如果表数据太多,就拆分,办法也有。
解决方案 »
- <jsp:include page= 动态参数问题
- WebWork的iterator标签嵌套问题
- struts2.0文件上传
- Struts,很迷茫。高手些来给小弟解决下问题嘛
- 一个关于jsp的小疑惑,大家帮忙啊
- Spring命名问题?
- tomcat配置数据源的问题
- "Java System Application Server Platform" 是一种什么样的服务器?
- frhwxx(笑对^_^人生) ()请进来领分!
- 求助javaWebStudio2004IDE开发Struts的配置?
- 求助:一直报java.lang.ClassNotFoundException
- 最近思维混乱.请教一下HttpServletRequest与HttpServletResponse的问 题
什么数据库?如果是Oracle的话,直接用SQL Loader把560W数据装入数据库,接着建立索引,最后剩下的就是一句Select的问题了。
借助数据库来完成大数据集运算,总体性能应该是最好的。程序处理的话,因为你文本文件每行数据并非定长,所以想搞什么并行计算也很麻烦,基本上就只能顺序处理。相当于要进行560W次的数据库检索,虽然有索引的情况下单词检索性能极高,但是估计也要跑个半天。大致方法如下:
1、数据库表中能对应文本的列,建立索引;
2、BufferReader + FileReader打开文件,每次readLine;
3、Select 数据库表看是否存在该行记录(有索引的情况下都是毫秒级执行),没有则写入另一个文件(记录所有不在表中的记录);
4、循环处理下一行。
为了尽量消除网络开销,程序如果能直接在数据库服务器上执行最好。
什么数据库?如果是Oracle的话,直接用SQL Loader把560W数据装入数据库,接着建立索引,最后剩下的就是一句Select的问题了。
借助数据库来完成大数据集运算,总体性能应该是最好的。
程序处理的话,因为你文本文件每行数据并非定长,所以想搞什么并行计算也很麻烦,基本上就只能顺序处
理。相当于要进行560W次的数据库检索,虽然有索引的情况下单词检索性能极高,但是估计也要跑个半天。大致方法如下:
1、数据库表中能对应文本的列,建立索引;
2、BufferReader + FileReader打开文件,每次readLine;
3、Select 数据库表看是否存在该行记录(有索引的情况下都是毫秒级执行),没有则写入另一个文件(记录所有不在表中的记录);
4、循环处理下一行。
为了尽量消除网络开销,程序如果能直接在数据库服务器上执行最好。
这个思路可行!
假设原始数据库在这两个表中: 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;