【发布时间】:2013-02-08 14:31:18
【问题描述】:
我有一个非常简单的域类和一个控制器,虽然运行时消耗超过 400MB - 需要一些关于优化它的建议。
基本上我有两个域类A和B,它们处于两个一对多的关系中(实际上B类代表A类实例之间的多对多关系,-A的单个对象可以被引用多个 B 的对象为“fromA”,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 的 RAM。我尝试每插入 10 000 条记录调用 hiernateSession.flush(),但总是在提交 120 000 到 300 000 条记录后,就会发生内存不足。
数据库中有 610 个 A,因此嵌入式循环有超过 370 000 个周期 (610x610)。
关于内存消耗如何优化此代码的任何指南?它是如此简单的代码,可能我在这里做了一些非常愚蠢的事情......
【问题讨论】:
标签: hibernate grails out-of-memory