2014-10-17 5 views
1

거대한 데이터로부터 grails 테이블을 채우는 것에 관한 많은 기사를 최근 읽었습니다. 그러나 천장에 닿았을 것 같습니다. 다음과 같이 내 코드는 다음과 같습니다그레이들에 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() 
    } 
} 

내가 장애인 보조 캐시가, 내가 할당 된 ID를 사용하고, 내가 명시 적으로 도메인이 아닌, hasMany의 및 belongsTo를 통해 많은 관계로이 많이 취급하고있다.

이 방법을 적용한 후에는 속도가 엄청나게 빨라졌지만, 잠시 후 삽입물은 시작 지점에서 약 623,000 분에 비해 거의 멈추는 지점까지 느려집니다.

내가 알아야 할 또 다른 메모리 누출이 있습니까, 아니면 Grails의 배치 삽입 측면에서 천장에 닿았습니까?

120 만 행을 삽입하는 데 약 2 분이 걸리지 만 속도가 느려집니다. 일괄 삽입을하고

+0

어떤 데이터베이스를 사용하십니까? btw, 당신은 평범한 SQL'insert into'를 실행하고 있는데 도메인 설정, 캐싱 등이 이것과 관련 될 수 있다는 것을 이해하지 못합니다 –

+0

그것은 h2 데이터베이스입니다. Ok gotcha, 나는 다른 방법을 시험해보고 결과가 있는지 확인했습니다. SQL은 내가 마지막으로 도랑 노력을했기 때문에 내가 gorm을 사용할 때 남아있는 것들이있을 수 있습니다. – janDro

+2

h2는 파일에서 직접 읽을 수 있습니다. http://www.h2database.com/html/functions.html?highlight=CSVREAD#csvread –

답변

2

시도, 그것은 내가 Grails의 이전 버전에두고 싸운 훨씬 더

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

알았어, 가능한 한 빨리 시험해 보게. 한 번에 몇 명이나 할 수 있습니까? – janDro

+0

유일한 제한은 힙 크기라고 생각합니다. 새로운 배치마다 사용 된 힙 크기를 늘립니다. –

+0

정말 고마워요! 나는이 일을 끝내었지만 파일을 덩어리로 나누었다. – janDro

1

효율적입니다. 그때 나는 적절한 덩어리로 일괄 처리를 수동으로 실행하거나 Pentaho Data Integration (또는 다른 ETL 도구 또는 DIY)과 같은 일괄 가져 오기를 위해 다른 도구를 사용했다.

+0

Davor의 답변에 stmt.addBatch를 사용하여 일괄 처리를 수동으로 수행했다. 단 한 번의 작업 일 뿐이다. 그렇지 않으면 나는 다른 도구를 사용했을 것입니다. 감사! – janDro

관련 문제