거대한 데이터로부터 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 분이 걸리지 만 속도가 느려집니다. 일괄 삽입을하고
어떤 데이터베이스를 사용하십니까? btw, 당신은 평범한 SQL'insert into'를 실행하고 있는데 도메인 설정, 캐싱 등이 이것과 관련 될 수 있다는 것을 이해하지 못합니다 –
그것은 h2 데이터베이스입니다. Ok gotcha, 나는 다른 방법을 시험해보고 결과가 있는지 확인했습니다. SQL은 내가 마지막으로 도랑 노력을했기 때문에 내가 gorm을 사용할 때 남아있는 것들이있을 수 있습니다. – janDro
h2는 파일에서 직접 읽을 수 있습니다. http://www.h2database.com/html/functions.html?highlight=CSVREAD#csvread –