非常に単純なドメイン クラスと、実行時に 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) を超えています。
メモリ消費に関してこのコードを最適化するためのガイドラインはありますか? これは非常に単純なコードなので、おそらくここで本当にばかげたことをしているのでしょう...