精华帖 (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
|
|
返回顶楼 | |
发表时间:2009-07-30
最后修改:2009-07-30
Jwind 写道 2.单个Excel,6万多行的文件是完全可以大于10M的(很多列) 要处理这么大的Excel还有很多校验逻辑,为什么非得在一个动作里做完呢? 尤其像楼主说的还有可能同时有多个用户提交。多大多快的机器也处理不了吧! |
|
返回顶楼 | |
发表时间:2009-07-31
Jwind 提出的先导入临时表再校验、处理的思路比较好
总之数据的处理和校验应当是花费最大的部分。 至于内存方面,为了不OOM,劝LZ还是放弃并发吧 |
|
返回顶楼 | |
发表时间:2009-07-31
谢谢各位。综合以上意见,
我决定暂时这样,当用户页面上选择多个excel文件后,单线程读取多个excel文件进行解析,解析结果直接存入临时表,全部保存完毕后触发一后台线程来处理,页面直接返回并且可以报告进度。后台线程每处理一条就打一个标记,处理完毕后页面提示用户成功。这样就不至于让用户一直处在等待中。 |
|
返回顶楼 | |
发表时间:2009-07-31
1,从Excel读取数据放入hashtable
2,对hashtable的数据进行格式验证 3,将hashtable里的数据放入数据库的临时表1 4,union all 临时表1和真实数据表,将结果只有一条的数据放入临时表2 5,删除临时表1中和临时表2相同的数据 |
|
返回顶楼 | |
发表时间:2009-08-01
我也是不建议用程序做
|
|
返回顶楼 | |
发表时间:2009-08-01
1、把excel文件上传到服务器,提示用户上传成功;
2、启动一个线程,把数据导入到临时表,返回导入成功,删除上传excel文件;如果导入失败,提示用户导入失败,删除上传excel文件; 3、利用存储过程或其他纯sql语句来验证临时表中的数据,验证有错,清空临时表中数据,返回错误信息。 |
|
返回顶楼 | |
发表时间:2009-08-01
ican 写道 1、把excel文件上传到服务器,提示用户上传成功;
2、启动一个线程,把数据导入到临时表,返回导入成功,删除上传excel文件;如果导入失败,提示用户导入失败,删除上传excel文件; 3、利用存储过程或其他纯sql语句来验证临时表中的数据,验证有错,清空临时表中数据,返回错误信息。 我就是用上面的方法做的速度很快,注意导入临时表的时候要用批量提交 |
|
返回顶楼 | |
发表时间:2009-08-03
eddysheng 写道 以前我们的管理系统用poi可以通过一个excel文件批量导入手机号码,在这个过程中需要验证号码格式、是否重复、系统是否存在等,因为效率问题,所以最后限定只导入excel文件的第一列,也就是65535行数据。
有一点要说一下,系统的数据量非常大,关联表的数据都是亿级。 现在有这么一个需求,要支持多个excel文件同时导入,不知道各位是否有好的建议?要从效率和空间上考虑,还好我们的服务器是4G内存。 我能想到的仅是多线程来处理,不至于处理过程要等半天。 any others? 试试openadaptor,里面有excel组件,可以直接解析excel,然后将其内容倒到其他地方(DB、File.......) 这个应该是最简单的,基本不用你写几行代码,配置下就行了 |
|
返回顶楼 | |
发表时间:2009-08-03
排重检查之类 先做好 然后 直接导入到数据库 看你用的是什么库了 这是效率最高的
|
|
返回顶楼 | |