IBM Support

コード生成中にメモリ不足関連のエラーが発生する現象について

Troubleshooting


Problem

[Japanese] 本技術情報では、コード生成中にメモリが不足する現象、及びその回避方法について説明します。

Symptom

例えばプロジェクト全体からのコード生成など、比較的負荷の大きいコード生成処理を実行すると、処理の途中に突然以下のエラーが出力され、コード生成処理を完了することができません。ひとたびエラーが出力されると、Rhapsody 本体や Windows の動きが不安定になったり、場合によってはマシーンを再起動しなければならない事象も報告されています。

image1

image2

text1
メモリが不足しています。

text2
Rhapsody could not allocate needed memory for XYZ bytes.
Please exit this application.

Cause

32 ビットの Windows 上では、1 プロセスが最大で利用できるユーザー・メモリ容量は 2 GB (カーネル部含めて全体で 4 GB )に制限されています。コード生成中のメモリ消費量がその許容範囲を超えてメモリを消費すると、Rhapsody は上記のエラーを出力します。

Environment

32-bit Windows

Resolving The Problem

<LANG>_CG::Configuration:ClassesPerCGCall プロパティ (*1) を使います。このプロパティを使うと、単一のコード生成プロセスを細かいチャンク(塊)に分けることで、コード生成中に消費されるメモリの容量を抑えることができます。
例えば、プロパティーの値を 500 に指定した場合、モデルに 501 から 1000 個のクラスがあれば、Rational Rhapsody は、コード生成アクションを 2 つのより小さいコード生成アクションに分割します。プロパティの値が -1 (デフォルト) に設定されていると、チャンク・メカニズムは使用されません。

(*1)
C++ エディションの場合、CPP_CG::Configuration:ClassesPerCGCall
C エディションの場合、C_CG::Configuration:ClassesPerCGCall

なお、ClassesPerCGCall は Rhapsody 7.5.3 から導入されました。 Rhapsody 7.5.3 以前の製品をお使いのお客様は、本技術情報下の【その他の回避策】項目をご覧ください。

【最適値の算出方法】

コード生成中のメモリ消費量は、モデル内のクラス数 (Actor や File を含む) や各パッケージに保存されている最大クラス総数、それからパッケージの構成などの要因によって決定されます。ClassesPerCGCall の最適値をみつけるためには、まずモデル内のクラス関連要素を 5 ~ 10 のチャンクにわけるつもりで値を指定します。
例えばクラスの数が 1000 個存在する場合には、ClassesPerCGCall の値を 200 程度に設定します。その後、コード生成に要した時間とメモリ消費量を測定します。その実行結果を基準として、プロパティ値を上下させるトライ&エラー方式を通じて、お客様のプロジェクトにあった最適値を探して下さい。なお、モデル内のクラスの総数より大きい値を指定しても、結局は 1 つのチャンク内で全てのクラスを生成しようとするため、チャンク・メカニズムを有効にする意味がありません。

以下は弊社で実施したベンチマークテストの簡単な実施結果です。


スコープ内のクラス数
200
550
650
1000
2000
スコープ内のパッケージ数
60
100
100
250
500
最適値
50
50
50
200
200


【本番モデルでの実例】


プロパティ適用前プロパティ適用後 (ClassesPerCGCall=200)
メモリ消費量850 MB230 MB
実行タイム640 秒600 秒


【その他の回避策】

Rhapsody 7.5.3 以前のバージョンをお使いの場合には、以下の回避策が考えられます。

(1) 高負荷コード生成をコマンド・ライン(RhapsodyCL.exe)から実行する。
(2) アプリケーションの仮想アドレス・サイズを 3 GB に設定する。
(3) 巨大なコンポーネントを小さなコンポーネント群へ分割する。

(1)
編集用 (GUI) と コード生成用 (コマンド・ライン) でそれぞれ独立した Rhapsody プロセスを立ち上げます。このように用途別にプロセスを起動することで、大きなリソース負荷を分散することができます。結果として、コード生成中に消費されるメモリ使用量を抑えることができます。

(2)
システムのメモリ容量にかかわらず、Windows は 4 GB の仮想アドレス・スペースを使用します。そして、2 GB をアプリケーションに、残りの 2 GB をシステムに割り当てます。「/3GB」スイッチを使用すると、Windows はアプリケーションに 3 GB を、システムに 1 GB を割り当てます。

このスイッチの使い方につきましては、Microsoft TechNet の 「Windows の /3GB 起動スイッチを設定する方法」及び 「Windows の限界に挑む: 仮想メモリ」参照してください。

(3)
もう1つの解決策として、1つのコンポーネントの中に数千のクラスを含む巨大なコンポーネントが存在する場合、そのコンポーネントを複数の小さなコンポーネントへ分割する方法があります。このような巨大コンポーネントからコード生成を実行すると、リソースの利用効率が悪化して、大きな負荷が Rhapsody へかかることになります。現在、このような巨大なコンポーネントの作成を禁止したり、明示的に制限する条項はどこにも設けられていませんが、コンポーネントのサイズを相応の大きさに保つことは、モデリングをする上でのベスト・プラクティスとして推奨されます。しかしながら、限られた時間の中でコンポーネントをモジュール化することが難しいことから、上記 3 つの解決策が好まれるケースも確実に存在します。

【よくある質問】

64 ビット版 Windows へ Rhapsody をインストールすることで、メモリ不足の問題を解決できますか?

残念ながら、解決することはできません。確かに、64 ビット版 Windows のアドレス空間は 4 GB よりはるかに大きいです。しかし、例え Rhapsody を 64 ビット環境へインストールしたとしても、設計上の理由により、Rhapsody は 32 ビットのアプリケーションとして稼動します。そのため、消費できる最大メモリ容量もまた 2 GB へ制限されます。ただし、 Rhapsody v7.6.1 からコード生成時のリソース・パフォーマンスが改善されました。この改善により、 64 ビット環境の場合で最大 4 GB のメモリが消費できるようになりました。

[{"Product":{"code":"SSB2MU","label":"IBM Engineering Systems Design Rhapsody"},"Business Unit":{"code":"BU059","label":"IBM Software w\/o TPS"},"Component":"General Information","Platform":[{"code":"PF033","label":"Windows"}],"Version":"7.5;7.5.1;7.5.2;7.5.3;7.6","Edition":"","Line of Business":{"code":"LOB59","label":"Sustainability Software"}}]

Product Synonym

Rational Rhapsody

Document Information

Modified date:
27 May 2022

UID

swg21567338