【问题标题】:Grails controller (simple) code consuming too much memory. How to optimise?Grails 控制器(简单)代码消耗过多内存。如何优化?
【发布时间】: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


    【解决方案1】:

    this article by Ted Naleid 中有一些非常好的 GORM 批处理性能提示。特别是,“Grails 性能调整”部分可能会有所帮助。

    【讨论】:

    • 非常感谢安德鲁!很棒的文章——我只需要一行代码,在我的 hiernateSession.flush() 旁边我只需要 hiernateSession.clear() :-)
    猜你喜欢
    • 2011-04-25
    • 1970-01-01
    • 2014-03-08
    • 1970-01-01
    • 2023-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-09
    相关资源
    最近更新 更多