论坛首页 Java企业应用论坛

征求方案-关于多个excel,大数据量同时导入

浏览 18852 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (7) :: 隐藏帖 (0)
作者 正文
   发表时间:2009-07-30  
Jwind 写道
个人认为上面说的还是没解决问题。
最近也碰到这样的问题了,我把问题说得更清楚点:

1.针对用户,只能是Excel
2.单个Excel,6万多行的文件是完全可以大于10M的(很多列)
3.最应该考虑的是内存和效率
内存:Excel本身大小、程序读取内容存储在内存中的大小
效率:Excel读取的速度、校验速度

最近在做类似这样的东西发现,首先考虑的是内存,LZ说是采用POI提供最简单的例子读取,这种默认采用usermodel方式读取,Excel文件如果大了,很有可能就会out of memry;可以考虑使用eventusermodel方式进行读取。至于baoq说的sqlldr ,因为考虑到服务器的实际的操作系统、配置等等,暂时放弃这种方式。

至于效率,一是校验内容的合法性、二是读取Excel速度。在校验时尽量的只考虑一些简单的条件,如是否为空、字段是否过长等等,至于唯一性这些可以暂时不考虑。先把数据导入到一张‘临时表’,然后用存储过程做更复杂的校验,最后的就是把‘临时表’中的数据分配到其他的表中。在整个过程中,只要发现有不合法的数据就立即清空现场,然后返回提示。另外一个就是Excel读取的速度了,不知道有不有比POI更好东西,因为这里只是读取,所以一直在找更好的方式来读取。至于LZ说得多线程,我认为这个并不是核心问题,把上面两个问题解决了,在考虑这个。

上面说的也没有解决LZ的问题,只是最近碰到,一起说出来,看有不有更好的解决方式。

试试fastexcel

 

0 请登录后投票
   发表时间:2009-07-30   最后修改:2009-07-30
Jwind 写道

2.单个Excel,6万多行的文件是完全可以大于10M的(很多列)


要处理这么大的Excel还有很多校验逻辑,为什么非得在一个动作里做完呢?
尤其像楼主说的还有可能同时有多个用户提交。多大多快的机器也处理不了吧!
0 请登录后投票
   发表时间:2009-07-31  
Jwind 提出的先导入临时表再校验、处理的思路比较好

总之数据的处理和校验应当是花费最大的部分。

至于内存方面,为了不OOM,劝LZ还是放弃并发吧
0 请登录后投票
   发表时间:2009-07-31  
谢谢各位。综合以上意见,
我决定暂时这样,当用户页面上选择多个excel文件后,单线程读取多个excel文件进行解析,解析结果直接存入临时表,全部保存完毕后触发一后台线程来处理,页面直接返回并且可以报告进度。后台线程每处理一条就打一个标记,处理完毕后页面提示用户成功。这样就不至于让用户一直处在等待中。
0 请登录后投票
   发表时间:2009-07-31  
1,从Excel读取数据放入hashtable
2,对hashtable的数据进行格式验证
3,将hashtable里的数据放入数据库的临时表1
4,union all 临时表1和真实数据表,将结果只有一条的数据放入临时表2
5,删除临时表1中和临时表2相同的数据
0 请登录后投票
   发表时间:2009-08-01  
我也是不建议用程序做
0 请登录后投票
   发表时间:2009-08-01  
1、把excel文件上传到服务器,提示用户上传成功;
2、启动一个线程,把数据导入到临时表,返回导入成功,删除上传excel文件;如果导入失败,提示用户导入失败,删除上传excel文件;
3、利用存储过程或其他纯sql语句来验证临时表中的数据,验证有错,清空临时表中数据,返回错误信息。
0 请登录后投票
   发表时间:2009-08-01  
ican 写道
1、把excel文件上传到服务器,提示用户上传成功;
2、启动一个线程,把数据导入到临时表,返回导入成功,删除上传excel文件;如果导入失败,提示用户导入失败,删除上传excel文件;
3、利用存储过程或其他纯sql语句来验证临时表中的数据,验证有错,清空临时表中数据,返回错误信息。


我就是用上面的方法做的速度很快,注意导入临时表的时候要用批量提交
0 请登录后投票
   发表时间:2009-08-03  
eddysheng 写道
以前我们的管理系统用poi可以通过一个excel文件批量导入手机号码,在这个过程中需要验证号码格式、是否重复、系统是否存在等,因为效率问题,所以最后限定只导入excel文件的第一列,也就是65535行数据。

有一点要说一下,系统的数据量非常大,关联表的数据都是亿级。

现在有这么一个需求,要支持多个excel文件同时导入,不知道各位是否有好的建议?要从效率和空间上考虑,还好我们的服务器是4G内存。

我能想到的仅是多线程来处理,不至于处理过程要等半天。

any others?


试试openadaptor,里面有excel组件,可以直接解析excel,然后将其内容倒到其他地方(DB、File.......)

这个应该是最简单的,基本不用你写几行代码,配置下就行了
0 请登录后投票
   发表时间:2009-08-03  
排重检查之类 先做好 然后 直接导入到数据库 看你用的是什么库了 这是效率最高的
0 请登录后投票
论坛首页 Java企业应用版

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