我使用的是grails 2.3.7和最新的excel-import插件(1.0.0)。我的要求是我需要将excel表的内容完全复制到数据库中。我的数据库是mssql server 2012.
我已经为开发版本提供了代码。当记录数量很少或者可能达到几百个时,代码工作正常。
但是在生产中,excel表格将包含多达50,000行和超过75列。
最初我遇到了数据内存异常。我将堆大小增加到8GB,但现在线程一直运行而没有终止。没有错误产生。
请注意,这是一次进行操作,并且将由确保此操作不会妨碍其他操作的人员执行。所以需要担心这个操作的巨大负担。我有能力运行它。
当记录高达10,000且列数相同时,数据会在大约5分钟内被复制。如果现在我有50,000行,那么理想的时间应该是大约5倍,大约是25分钟。但是代码一直运行了一个多小时而没有终止。
知道如何解决这个问题。任何帮助都非常感谢。
答案 0 :(得分:0)
如果你在内存中加载5倍以上的数据,它并不总是需要5倍以上。我猜大多数8GB都在虚拟内存中,虚拟内存在硬件上非常慢。尝试减少内存,运行一些内存测试并尝试尽可能多地使用RAM。
答案 1 :(得分:0)
根据我的经验,Grails中大批量操作的正常问题。我认为你的内存泄漏会在操作过程中从根本上减慢操作速度。
我的解决方案是使用Pentaho Kettle等ETL工具进行导入,或者将导入块导入可管理的部分。请参阅此相关问题:
答案 2 :(得分:0)
从技术上讲,这不是您问题的答案,但您是否考虑过使用CSV而不是excel?
从用户的角度来看,在导入之前保存为CSV并不是很多工作。
我正在加载,验证和保存200-300 000行的CSV,没有任何障碍。 只要确保你在服务中有逻辑,就可以围绕它进行交易。
可能需要更多代码来解码csv,特别是要转换为各种原语,但它应该要快几个数量级。