首页 文章

Grails控制器(简单)代码占用过多内存 . 如何优化?

提问于
浏览
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的RAM . 我尝试每隔10 000条记录调用hiernateSession.flush(),但总是在120 000到300 000条记录被提交后,内存不足 .

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

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

1 回答

  • 2

    this article by Ted Naleid中有一些非常好的GORM批处理性能提示 . 特别是,"Grails Performance Tweaks"部分可能有所帮助 .

相关问题