我讀了很多文章最近有關從龐大的數據填充一個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萬行,但隨後便開始放慢。
你使用什麼數據庫?順便說一句,你正在執行簡單的sql'插入到',不明白域配置,緩存等可以與這個 – 2014-10-17 06:36:00
這是一個h2數據庫。好吧,我只是嘗試不同的方法,看看我是否有結果。 Sql是我最後一次努力的工作,所以當我使用gorm時可能會留下一些遺漏。 – janDro 2014-10-17 12:30:02
H2可以直接從文件中讀取,看到http://www.h2database.com/html/functions.html?highlight=CSVREAD#csvread – 2014-10-17 12:40:00