2014-10-17 16 views
1

我讀了很多文章最近有關從龐大的數據填充一個Grails表,但似乎已經觸及天花板。我的代碼如下:插入10,000,000+ 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和屬於關聯處理這種多對多的關係。

我的速度應用這些方法身世後增加,但經過一段時間的插入放慢相比,約623,000每之初分鐘幾乎停止點。

是否有我應該知道的或有我只是碰到天花板在Grails的批量插入方面的一些其他的內存泄漏?

要清楚它大約需要2分鐘插入120萬行,但隨後便開始放慢。

+0

你使用什麼數據庫?順便說一句,你正在執行簡單的sql'插入到',不明白域配置,緩存等可以與這個 – 2014-10-17 06:36:00

+0

這是一個h2數據庫。好吧,我只是嘗試不同的方法,看看我是否有結果。 Sql是我最後一次努力的工作,所以當我使用gorm時可能會留下一些遺漏。 – janDro 2014-10-17 12:30:02

+2

H2可以直接從文件中讀取,看到http://www.h2database.com/html/functions.html?highlight=CSVREAD#csvread – 2014-10-17 12:40:00

回答

2

嘗試做批量插入,這是更有效的

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

明白了,請儘快嘗試一下。一次有多少人可以做到最大? – janDro 2014-10-17 12:30:48

+0

我認爲唯一的限制是你的堆大小。每增加一批,您都會增加使用的堆大小。 – 2014-10-17 13:07:11

+0

非常感謝你!我結束了這樣做,但也分裂了檔案 – janDro 2014-10-17 20:27:41

1

我已在早期版本的Grails的這個戰鬥。當時我只是簡單地以合適的塊來手動運行批處理,或者使用其他工具進行批量導入,例如Pentaho數據集成(或其他ETL工具或DIY)。

+0

我最終在Davor的答案中手動執行了stmt.addBatch的批處理,只是因爲這是一次性的事情。否則,我會使用其他工具。謝謝! – janDro 2014-10-17 20:29:35