0

非常に単純なドメイン クラスと、実行時に 400MB 以上を消費するコントローラーがあります。最適化についてアドバイスが必要です。

基本的に、2 つのドメイン クラス A と B があり、これらは 2 つの 1 対多の関係にあります (実際、クラス B は、クラス A インスタンス間の多対多の関係を表します。A の単一のオブジェクトは、複数の B のオブジェクトによって参照できます)。 as 'fromA' および 1 つの 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 を 2 つの方法で参照するだけです。

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) を超えています。

メモリ消費に関してこのコードを最適化するためのガイドラインはありますか? これは非常に単純なコードなので、おそらくここで本当にばかげたことをしているのでしょう...

4

1 に答える 1