在grails中插入10000000多行

在grails中插入10000000多行,grails,bigdata,Grails,Bigdata,我最近读了很多关于从海量数据填充grails表的文章,但似乎已经达到了极限。我的代码如下: class LoadingService { def sessionFactory def dataSource def propertyInstanceMap = org.codehaus.groovy.grails.plugins.DomainClassGrailsPlugin.PROPERTY_INSTANCE_MAP def insertFile(fileName

我最近读了很多关于从海量数据填充grails表的文章,但似乎已经达到了极限。我的代码如下:

class LoadingService {
    def sessionFactory
    def dataSource
    def propertyInstanceMap = org.codehaus.groovy.grails.plugins.DomainClassGrailsPlugin.PROPERTY_INSTANCE_MAP

    def insertFile(fileName) {
        InputStream inputFile = getClass().classLoader.getResourceAsStream(fileName)
        def pCounter = 1
        def mCounter = 1
        Sql sql = new Sql(dataSource)
        inputFile.splitEachLine(/\n|\r|,/) { line -> 
            line.each { value ->
                if(value.equalsIgnoreCase('0') { 
                    pCounter++
                    return
                }
                sql.executeInsert("insert into Patient_MRNA (patient_id, mrna_id, value) values (${pCounter}, ${mCounter}, ${value.toFloat()})")
                pCounter++
            }
            if(mCounter % 100 == 0) {
                cleanUpGorm()
            }
            pCounter = 1
            mCounter++
        }
    }

    def cleanUpGorm() {
        session.currentSession.clear()
        propertyInstanceMap.get().clear()
    }
}
我已经禁用了辅助缓存,我正在使用分配的ID,我正在通过一个域显式地处理这种多对多关系,而不是hasMany和belongsTo

应用这些方法后,我的速度显著提高,但过了一段时间,插入速度下降到几乎停止的程度,而开始时为每分钟623000次

我是否应该注意到其他内存泄漏,或者我在grails中的批插入已经达到了极限


明确地说,插入120万行大约需要2分钟,但随后它们开始减速

尝试批量插入,这样效率更高

def updateCounts = sql.withBatch { stmt ->
     stmt.addBatch("insert into TABLENAME ...")
     stmt.addBatch("insert into TABLENAME ...")
     stmt.addBatch("insert into TABLENAME ...")
     ...
 }

尝试批量插入,这样效率更高

def updateCounts = sql.withBatch { stmt ->
     stmt.addBatch("insert into TABLENAME ...")
     stmt.addBatch("insert into TABLENAME ...")
     stmt.addBatch("insert into TABLENAME ...")
     ...
 }


我在Grails的早期版本中对此进行了讨论。当时,我要么在适当的块中手动运行批处理,要么使用另一种工具进行批处理导入,如Pentaho数据集成或其他ETL工具或DIY。

我在早期版本的Grails中对此进行了讨论。当时,我求助于简单地在适当的块中手动运行批处理,或者使用其他工具进行批处理导入,例如Pentaho数据集成或其他ETL工具或DIY。

您使用什么数据库?顺便说一句,您正在执行纯sql insert into,不明白域配置、缓存等如何与此相关。这是一个h2数据库。好的,明白了,我只是在尝试不同的方法,看看是否有结果。Sql是我最后的努力,所以在我使用gorm.h2时可能会有一些东西遗留下来。h2可以直接从文件中读取,谢谢,是的,这就是我在其他表中使用的东西。最后一个是一个联合表,所以我觉得使用groovy有点舒服,但如果它不起作用,可能会恢复到这个状态?顺便说一句,您正在执行纯sql insert into,不明白域配置、缓存等如何与此相关。这是一个h2数据库。好的,明白了,我只是在尝试不同的方法,看看是否有结果。Sql是我最后的努力,所以在我使用gorm.h2时可能会有一些东西遗留下来。h2可以直接从文件中读取,谢谢,是的,这就是我在其他表中使用的东西。最后一个是连接表,所以我觉得使用groovy有点舒服,但如果它不起作用,可能会恢复到这个状态。明白了,我会尽快尝试一下。一次最多可以做多少件事?我认为唯一的限制是堆的大小。每增加一批,您就可以增加旧堆的大小。非常感谢!最后我做了这件事,但也把文件分成了几块。我会尽快尝试一下。一次最多可以做多少件事?我认为唯一的限制是堆的大小。每增加一批,您就可以增加旧堆的大小。非常感谢!我最终完成了这项工作,但也将文件分割成了块。我最终使用Davor回答中的stmt.addBatch手动进行了批处理,只是因为这是一次性的。否则我会用其他的工具。谢谢我最终用Davor回答中的stmt.addBatch手动完成了批处理,只是因为这是一次性的。否则我会用其他的工具。谢谢