2014-10-17 4 views
1

Недавно я прочитал много статей о заполнении таблицы Грааля из огромных данных, но, похоже, попал в потолок. Мой код выглядит следующим образом:Вставьте 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 минут, но затем они начинают замедляться.

+0

какая база данных вы используете? Кстати, вы выполняете простой sql 'insert into', не понимаете, как конфигурация домена, кэширование и т. д. могут относиться к этому –

+0

, это база данных h2. Ok gotcha, я просто пытался использовать разные методы и посмотреть, есть ли у меня результаты. Sql был моим последним усилием в канаве, поэтому могут быть некоторые вещи, оставшиеся после того, как я использовал gorm. – janDro

+2

h2 может читать непосредственно из файла, см. Http://www.h2database.com/html/functions.html?highlight=CSVREAD#csvread –

ответ

2

Попробуйте делать пакетную вставки, это гораздо более эффективным

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

Получил это, попробует как можно скорее. Существует ли максимум, сколько можно было бы сделать за один раз? – janDro

+0

Я думаю, что единственным ограничением является размер вашей кучи. С каждой новой версией вы увеличиваете размер используемой кучи. –

+0

спасибо soo много! Я закончил это, но также разделил файл на куски. – janDro

1

Я боролся с этим в более ранних версиях Grails. В то время я прибегал к простому запуску партии вручную в правильных кусках или использованию другого инструмента для пакетного импорта, такого как интеграция данных Pentaho (или другой инструмент ETL или DIY).

+0

. Я закончил партию вручную с помощью stmt.addBatch в ответе Davor, только потому, что это одно время. В противном случае я бы использовал другой инструмент. Благодаря! – janDro

Смежные вопросы