誰もがソフトウェアがスムーズかつ迅速に実行されることを期待しています。クラッシュやフリーズが発生する余地や時間はありません。モデル開発者にとっては、モデルのパフォーマンスを優先し、最適化手法を使用することを意味します。
この革新的なツールがモデルのパフォーマンスをどのように向上させることができるかを示す 2 つの説得力のある例を詳しく見ていきましょう。
コンテンツ:
AnyLogic のメモリアナライザー概要
最新の AnyLogic 8.9 のリリースでは、メモリ アナライザーが導入されました。これは、パフォーマンスのボトルネックを見つけ、メモリ リークを特定し、さまざまな最適化手法を適用してモデルを微調整できるように設計された強力な組み込みツールです。
メモリ アナライザーの使用を開始するには、モデルを実行してアナライザーをアクティブ化します。上部のメニューで、Modelセクションを選択し、Memory dumpをクリックします。
メモリ アナライザーを有効にすると、実行中にモデルのさまざまなコンポーネントがメモリをどのように消費するかを追跡します。大量のランダム アクセス メモリ (RAM) を占有する特定のオブジェクト、クラス、インスタンスなど、モデルのどの部分が最も多くのメモリを使用しているかを強調表示する詳細なレポートを生成します。
メモリアナライザーを適用してモデルのパフォーマンスを向上させる使用事例
複雑なプロセスでは、効果的なモデル最適化には、大量の RAM を必要とする要素を管理する必要があります。モデルを構築した後、どの部分が最も多くのメモリを使用するかを特定するのは困難な場合があります。
メモリ アナライザーを使用すると、リソースを大量に消費するコンポーネントを特定し、最適化してモデルのパフォーマンスを向上させることができます。メモリ アナライザーがこのような問題の検出にどのように役立つか、例を挙げて説明します。
ケース1: メモリボトルネックの特定
モデルのさまざまな部分の統計を処理するために別のエージェントを作成することは、シミュレーション モデリングでは一般的な方法です。このエージェントを StatisticsAgent と呼び、必要な統計要素を追加してみましょう。
この StatisticsAgent を別のエージェントのマークアップ スペースにドラッグ アンド ドロップして、その要素の動作を簡単に確認できます。
ただし、この単純なモデルを実行すると、割り当てられたメモリのほぼすべてが使用されることに気付くかもしれません。
メモリ アナライザーを使用すると、どのオブジェクトが最も多くの RAM を消費しているかをすばやく特定し、モデルのパフォーマンスを向上させることができます。この場合、 Top Consumers セクションには、原因が StatisticsAgent にあることが示されており、具体的には 1,500 個のオブジェクトがこれに該当します。
StatisticsAgent は、単一のエージェントではなく、エージェントの集団を作成するように設定されていました。この間違いにより、1,499 個の不要な StatisticsAgent オブジェクトが作成され、すべてのメモリが消費され、モデルの実行が妨げられました。
幸いなことに、これらの余分なエージェントを削除すると、メモリ使用量がわずか 10% に削減されました。これは、モデルのパフォーマンスを向上させるためにモデルの最適化がいかに重要であるかを示しています。
単純なモデルであっても、適切に構築されていないと、すぐに使用可能なメモリを使い果たし、クラッシュする可能性があります。この例では、小さなミスがメモリの使用不良につながる可能性があることを示しました。
ケース2: メモリリークの修正
ここで、モデル開発における一般的な問題である、Java 関連のメモリ リークについて見てみましょう。メモリ リークは、未使用のオブジェクトがプログラムのメモリ内に残り、ガベージ コレクターがそれらを削除できない場合に発生します。これにより、不要な RAM が使用され、モデルに影響します。実際の例を通して、メモリ アナライザーがこれらのリークを検出して修正し、モデルのパフォーマンスを向上させる方法を見てみましょう。
AnyLogic では、コードを使用してエージェントを作成できます。たとえば、部品番号のコレクションを保持するストレージ エージェントを定義します。簡単にするために、すべての部品番号が同一であると仮定します。これらのエージェントをいくつか追加すると、モデルはすぐに使用可能なメモリをすべて使い果たし、クラッシュします。
メモリ アナライザーを使用すると、ストレージ コレクションが問題の原因であることがわかります。エージェントとそのコレクションを削除した後でも、メモリは完全に解放されません。
コレクション タイプは ArrayList であり、内部的に配列を使用していることがわかります。配列をクリアすると、その要素は null になり、Java ガベージ コレクターによって最終的に削除されます。ただし、配列のサイズは変更されないため、メモリを消費します。
これを修正するには、多数のオブジェクトを含むコレクションを削除するときに、コレクションをクリアするだけでなく、正しい関数を使用して配列のサイズを調整する必要があります。巨大なコレクションを持つエージェントを削除するためのコードは次のとおりです。
for (Storage agent: storages){
agent.partNumbers.clear();
agent.partNumbers.trimToSize();
}
while(!storages.isEmpty()){
remove_storages (storages.get(0));
}
System. gc ();
このアクションにより、適切なメモリ解放が保証され、モデルのパフォーマンスが向上します。
シミュレーションモデルに最適な最適化手法
上記のユースケースでは、モデルのパフォーマンスに影響を与える 2 つの一般的な問題を確認しました。その他の最適化手法をお探しの場合は、次のオプションをご検討ください:
- エージェントの数を最小限にする
モデルには必要なエージェントのみを残してください。エージェントが多すぎると、メモリと処理能力が浪費される可能性があります。 - シンプルなロジックを使用
モデルではシンプルなロジックを使用します。複雑な決定木(decision tree)や不必要な計算は避けてください。よりシンプルなロジックにより、モデルのパフォーマンスが向上し、理解とデバッグが容易になります。 - 効率的なデータ処理
本当に必要なデータのみを保存し、効率的なデータ構造を使用します。データセットが大きく、データ処理が不十分だと、モデルの最適化に影響します。データ アクセスを高速化するには、インデックス コレクションまたはハッシュ マップの使用を検討してください。 - 組み込み関数を活用
AnyLogic の組み込み関数とライブラリは、最適なモデル最適化のために設計されているため、それらを使用します。 - バッチ実験を実行
バッチ実験は、複数のシナリオとパラメータを自動的にテストするのに適したオプションです。モデルのパフォーマンスを向上させるための最適な設定を見つけるのに役立ちます。 - リソース使用の最適化
メモリと CPU の使用量を慎重に管理します。メモリ アナライザーなどのツールを使用して、メモリ リークやボトルネックを検出して修正します。 - 並列処理を活用
可能であれば、並列処理を使用して複数のシミュレーションを同時に実行します。これにより、計算時間が短縮され、モデル全体のパフォーマンスが向上します。
AnyLogic によるモデルパフォーマンスの向上
モデルの最適化は、モデルがスムーズかつ効率的に動作するために不可欠です。AnyLogic は、モデルの弱点を特定して対処することでモデルの効率を高める強力なメモリ アナライザーを導入しました。
このツールを活用し、最適化手法に従うことで、モデルのパフォーマンスを大幅に向上させ、モデルが適切に動作し、現実的なデータを提供することが保証されます。この記事が、お客様のモデルで AnyLogic メモリ アナライザーをテストするきっかけになれば幸いです。
AnyLogic ソフトウェアで最高のモデリングテクノロジーを活用しましょう。