锁定老帖子 主题:记一次代码优化(大数据量处理及存储)
精华帖 (5) :: 良好帖 (4) :: 新手帖 (0) :: 隐藏帖 (1)
|
|
---|---|
作者 | 正文 |
发表时间:2010-02-18
inter12 写道 抛出异常的爱 写道 thread.setPriority
大过年的 设置线程的优先级,好像从来没起作用过 代码里需要加入yield(); 不然不会把cpu让给别的线程的的。 而且你的程式问题出在了内存占用过大的问题上 使用流读入每次都只运行一条记录 对于排重前阵子刚刚用过Bloom Filter基本上可以用来排重 对于大数据应该不需要总回滚。 可以减少事务边界(3000条一commit) |
|
返回顶楼 | |
发表时间:2010-02-19
lz是做电信行业的吧。移动boss
|
|
返回顶楼 | |
发表时间:2010-02-19
我做过类似的东西
我的是100w左右 |
|
返回顶楼 | |
发表时间:2010-02-19
1个txt文件100w数据
|
|
返回顶楼 | |
发表时间:2010-02-20
Thread.yield(); //这个是否效果更好?
|
|
返回顶楼 | |
发表时间:2010-02-21
zhouky4665 写道 直接用sqlload直接导入数据库,然后写个存储过程处理业务逻辑,比如去重、有效性检查。 这样非常快,200w数据最多2分钟搞定 问题是用sqlload的是需要将数据文件存放在服务器中,那是否需要定义一个crontab来扫描这些文件? 而我们需要实时的将数据保存到数据库中。 |
|
返回顶楼 | |
发表时间:2010-02-21
beckrabbit 写道 客户端要上传的这个20W到200W数据的文件也是程序生成的吧,为什么不优化客户端,每批少量,分多次上传呢? 20W已经是最低的数据量了 |
|
返回顶楼 | |
发表时间:2010-02-21
抛出异常的爱 写道 inter12 写道 抛出异常的爱 写道 thread.setPriority 大过年的 设置线程的优先级,好像从来没起作用过 代码里需要加入yield(); 不然不会把cpu让给别的线程的的。 而且你的程式问题出在了内存占用过大的问题上 使用流读入每次都只运行一条记录 对于排重前阵子刚刚用过Bloom Filter基本上可以用来排重 对于大数据应该不需要总回滚。 可以减少事务边界(3000条一commit) JDK1.5以后就不推荐使用yield方法了。 而本案的方法主要是为了降低CPU及内存,只要将这些资源将下来就可以,倒不在乎相应的快慢 我这里的排重用的是hashSet,本省就已经自带了排重效果。 Bloom Filter没有用过,有时间研究下。 同时我在体中已经写明了 是5000数据COMMIT一次。 |
|
返回顶楼 | |
发表时间:2010-02-21
inter12 写道 zhouky4665 写道 直接用sqlload直接导入数据库,然后写个存储过程处理业务逻辑,比如去重、有效性检查。
这样非常快,200w数据最多2分钟搞定 问题是用sqlload的是需要将数据文件存放在服务器中,那是否需要定义一个crontab来扫描这些文件? 而我们需要实时的将数据保存到数据库中。 sqlldr可以不在oracle服务器端,在你web服务器端也可,不过要安装oracle客户端。不用crontab,文件上传完成后直接调用sqlldr命令即可。 |
|
返回顶楼 | |
发表时间:2010-02-22
可不可以将文本先导入到数据库之中的临时表中,然后用存储过程处理。
|
|
返回顶楼 | |