Недавно я прочитал много статей о заполнении таблицы Грааля из огромных данных, но, похоже, попал в потолок. Мой код выглядит следующим образом:Вставьте 10 000 000+ строк в графы
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()
}
}
Я отключил вторичный кэш, я использую присвоенные идентификаторы, и я явно обработки этого отношения многие ко многим через домен, а не hasMany и belongsTo.
Моя скорость увеличилась монументально после применения этих методов, но через некоторое время вставки замедляются вплоть до почти остановки по сравнению с примерно 623 000 в минуту в начале.
Есть ли какая-то другая утечка памяти, о которой я должен знать, или я просто попал в потолок с точки зрения пакетных вставок в грабелях?
Для того, чтобы вставить 1,2 миллиона строк, требуется около 2 минут, но затем они начинают замедляться.
какая база данных вы используете? Кстати, вы выполняете простой sql 'insert into', не понимаете, как конфигурация домена, кэширование и т. д. могут относиться к этому –
, это база данных h2. Ok gotcha, я просто пытался использовать разные методы и посмотреть, есть ли у меня результаты. Sql был моим последним усилием в канаве, поэтому могут быть некоторые вещи, оставшиеся после того, как я использовал gorm. – janDro
h2 может читать непосредственно из файла, см. Http://www.h2database.com/html/functions.html?highlight=CSVREAD#csvread –