我有一个非常简单的域类和一个控制器,当运行时消耗超过400MB时 - 需要一些优化它的建议。
基本上我有两个域类A和B,它们是两个一对多的关系(实际上,B类代表A类实例之间的多对多关系, - A的单个对象可以被引用作为'fromA'的多个B对象和A的单个对象可以被多个B的对象称为'toA' - 如GORM文档和航班和机场示例 - A是机场而B是航班)。 A类是一个非常简单的域类。
class A {
static hasMany = [fromAs:B, toAs:B]
static mappedBy = [fromAs:"fromA", toAs:"toA"]
int ...
String ...
// several simple fields
}
B类也很简单,它只是以两种方式引用A类。
class B {
A fromA
A toA
int ...
String ...
// several simple fields
}
现在控制器所做的是将所有可能的“航班”信息填充到数据库中。它还对int进行了一些非常小的计算,作为那些int的设置,但为了使代码清晰,我正在跳过它。
A.list().each{ tempFromA ->
A.list().each{ tempToA ->
def b = new B()
b.setFromA(tempFromA)
b.setToA(tempToA)
b.save(flush:false)
}
}
这就是所有代码,它消耗的内存超过400MB。我尝试每隔10 000条记录调用hiernateSession.flush(),但总是在120 000到300 000条记录被提交后,内存不足发生。
数据库中有610个A,因此嵌入式循环有超过370 000个循环(610x610)。
如何根据内存消耗来优化此代码?这是如此简单的代码,我可能正在做一些非常愚蠢的事情......
答案 0 :(得分:2)
this article by Ted Naleid中有一些非常好的GORM批处理性能提示。特别是" Grails Performance Tweaks"部分可能有帮助。