我正在处理一个大型 csv 文件,我发现这篇关于批量导入的文章:http: //naleid.com/blog/2009/10/01/batch-import-performance-with-grails-and-mysql/。我尝试做同样的事情,但似乎没有任何效果。
每次刷新后是否应该在数据库中查看实例?因为当我尝试查询“SELECT COUNT(*) FROM TABLE1”时,现在有 0 个或所有实体,所以看起来这些实例是一次性提交的。
然后我还注意到第一次导入空白表时导入工作很快,但是当表已满并且实体应该更新或另存为新时,整个过程非常缓慢。这主要是因为内存没有被清理并减少到1MB或更少,并且应用程序卡住了。那么是因为没有刷新会话吗?
我的导入代码在这里:
public void saveAll(List<MedicalInstrument> listMedicalInstruments) {
log.info("start saving")
for (int i = 0; i < listMedicalInstruments.size() - 1; i++) {
def medicalInstrument = listMedicalInstruments.get(i)
def persistedMedicalInstrument = MedicalInstrument.findByCode(medicalInstrument.code)
if (persistedMedicalInstrument) {
persistedMedicalInstrument.properties = medicalInstrument.properties
persistedMedicalInstrument.save()
} else {
medicalInstrument.save()
}
if ((i + 1) % 100 == 0) {
cleanUpGorm()
if ((i + 1) % 1000 == 0) {
log.info("saved ${i} entities")
}
}
}
cleanUpGorm()
}
protected void cleanUpGorm() {
log.info("cleanin GORM")
def session = sessionFactory.currentSession
session.flush()
session.clear()
propertyInstanceMap.get().clear()
}
非常感谢您的帮助!
问候,
洛伊扎
PS:我的 JVM 内存总共有 252.81 MB,但它只是我和其他 3 人的测试环境。