论坛首页 Java企业应用论坛

记一次代码优化(大数据量处理及存储)

浏览 18308 次
精华帖 (5) :: 良好帖 (4) :: 新手帖 (0) :: 隐藏帖 (1)
作者 正文
   发表时间:2010-02-18  
inter12 写道
抛出异常的爱 写道
thread.setPriority
大过年的


设置线程的优先级,好像从来没起作用过

代码里需要加入yield();
不然不会把cpu让给别的线程的的。
而且你的程式问题出在了内存占用过大的问题上
使用流读入每次都只运行一条记录
对于排重前阵子刚刚用过Bloom Filter基本上可以用来排重
对于大数据应该不需要总回滚。
可以减少事务边界(3000条一commit)


0 请登录后投票
   发表时间:2010-02-19  
lz是做电信行业的吧。移动boss
0 请登录后投票
   发表时间:2010-02-19  
我做过类似的东西
我的是100w左右
0 请登录后投票
   发表时间:2010-02-19  
1个txt文件100w数据
0 请登录后投票
   发表时间:2010-02-20  
Thread.yield(); //这个是否效果更好?
0 请登录后投票
   发表时间:2010-02-21  
zhouky4665 写道
直接用sqlload直接导入数据库,然后写个存储过程处理业务逻辑,比如去重、有效性检查。
这样非常快,200w数据最多2分钟搞定

问题是用sqlload的是需要将数据文件存放在服务器中,那是否需要定义一个crontab来扫描这些文件?
而我们需要实时的将数据保存到数据库中。
0 请登录后投票
   发表时间:2010-02-21  
beckrabbit 写道
客户端要上传的这个20W到200W数据的文件也是程序生成的吧,为什么不优化客户端,每批少量,分多次上传呢?

20W已经是最低的数据量了
0 请登录后投票
   发表时间:2010-02-21  
抛出异常的爱 写道
inter12 写道
抛出异常的爱 写道
thread.setPriority
大过年的


设置线程的优先级,好像从来没起作用过

代码里需要加入yield();
不然不会把cpu让给别的线程的的。
而且你的程式问题出在了内存占用过大的问题上
使用流读入每次都只运行一条记录
对于排重前阵子刚刚用过Bloom Filter基本上可以用来排重
对于大数据应该不需要总回滚。
可以减少事务边界(3000条一commit)



JDK1.5以后就不推荐使用yield方法了。
而本案的方法主要是为了降低CPU及内存,只要将这些资源将下来就可以,倒不在乎相应的快慢
我这里的排重用的是hashSet,本省就已经自带了排重效果。
Bloom Filter没有用过,有时间研究下。
同时我在体中已经写明了 是5000数据COMMIT一次。
0 请登录后投票
   发表时间:2010-02-21  
inter12 写道
zhouky4665 写道
直接用sqlload直接导入数据库,然后写个存储过程处理业务逻辑,比如去重、有效性检查。
这样非常快,200w数据最多2分钟搞定

问题是用sqlload的是需要将数据文件存放在服务器中,那是否需要定义一个crontab来扫描这些文件?
而我们需要实时的将数据保存到数据库中。

sqlldr可以不在oracle服务器端,在你web服务器端也可,不过要安装oracle客户端。不用crontab,文件上传完成后直接调用sqlldr命令即可。
0 请登录后投票
   发表时间:2010-02-22  
可不可以将文本先导入到数据库之中的临时表中,然后用存储过程处理。
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics