0

我有一个非常简单的域类和一个控制器,虽然运行时消耗超过 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 od RAM。我尝试每插入 10 000 条记录调用 hiernateSession.flush() ,但总是在提交 120 000 到 300 000 条记录后,就会发生内存不足。

数据库中有 610 个 A,因此嵌入式循环有超过 370 000 个周期 (610x610)。

任何指南如何在内存消耗方面优化此代码?它是如此简单的代码,可能我在这里做一些非常愚蠢的事情......

4

1 回答 1

2

Ted Naleid的这篇文章中有一些非常好的 GORM 批处理性能技巧。特别是,“Grails Performance Tweaks”部分可能会有所帮助。

于 2013-02-08T15:55:44.403 回答