我使用的是grails 2.3.7和最新的excel导入插件(1.0.0)。我的要求是,我需要将excel工作表的内容完全复制到数据库中。我的数据库是mssql server 2012。
我已经得到了开发版本的代码。当记录数很少或可能高达几百条时,代码工作得很好。
但是在生产中,excel表格将有多达50,000行和超过75列。
最初,我遇到了一个数据内存不足的异常。我将堆大小增加到8 8GB,但现在线程继续运行,不会终止。不会生成任何错误。
请注意,这只是一次操作,将由确保此操作不会妨碍其他并行运行的操作的人员执行。所以需要担心这个操作的巨大负载。我能负担得起运营它。
当记录数量达到10,000个且列数相同时,数据大约在5分钟内被复制。如果我现在有50,000行,那么理想情况下所用的时间应该是5倍左右,也就是大约25分钟。但代码持续运行了一个多小时,没有终止。
任何关于这个问题的想法。任何帮助都是非常感谢的。
发布于 2014-11-07 17:04:03
如果在内存中加载5倍以上的数据,并不总是需要5倍以上的时间。我猜大部分8 8GB的内存都在虚拟内存中,而虚拟内存在硬件上非常慢。尝试减少内存,运行一些内存测试,并尝试尽可能多地使用RAM。
发布于 2014-11-07 17:16:35
根据我的经验,Grails中的大型批处理操作是一个常见的问题。我认为你有内存泄漏,这从根本上减慢了操作进行的速度。
我的解决方案是使用ETL工具进行导入,或者将导入分成可管理的块。请参阅此相关问题:
发布于 2014-11-07 18:20:43
从技术上讲,这不是你的问题的答案,但你有没有考虑过只使用CSV而不是excel?
从用户的角度来看,在导入之前另存为CSV并不是一项很大的工作。
我正在加载,验证和保存CSV与200-30万行没有任何问题。只需确保您在服务中具有逻辑,这样它就可以围绕它进行事务处理。
可能会有更多的代码来解码csv,特别是转换成各种原语,但它应该快几个数量级。
https://stackoverflow.com/questions/26797077
复制相似问题