2016-06-23 17 views
2

私はMatlabで書かれたリアルタイムデータ同化プログラムを実行していますが、メモリリークが遅いようです。約16日間にわたって、平均メモリ使用量は約1.1GBから約1.5GBまで約40%(下図参照)増加しています。プログラムは15分ごとにループし、データ同化ステップ中に約30秒間メモリ使用量にピークがあります(図に示されています)。各15分サイクルの終わりにMatlabプロセスメモリリーク16日以上

Blue: Matlab process memory usage measured once a second over the course of 16 days. Red: Linear trend in memory usage over time

、私はwhos機能を使用して.MATファイルに名前、サイズ、および現在アクティブなワークスペース内のすべての変数の型を保存しています。 100以上の変数があり、約16日間コードを実行した後は、いずれの変数でも使用されているメモリの量に明らかな傾向はありません。

一部の変数は各サイクルの終了時にクリアされますが、一部の変数はクリアされません。私もclose allに電話をかけている人物がいないことを確認しています。私はASCIIファイルを書くときに必ずfclose(fileID)というファイルを書きました。

私は困惑しています...私が探しているものや問題を追跡するのに役立つツールについての提案があれば、私は疑問に思っています。前もって感謝します!

編集、システム情報: RHEL 6.8 のMatlab R2014b

+1

実際のコードで数字を開いたり閉じたりしていますか?代わりに既存の数字を再利用することをお勧めします。結果として得られるコードはより高速になるかもしれません。過去のメモリ問題の原因となっているこの種のことを思い出しています。 – horchler

+1

また、Matlabプロファイラの[文書化されていないメモリプロファイリング](http://undocumentedmatlab.com/blog/undocumented-profiler-options)を試してみましたか? – horchler

+0

あなたは "純粋な" matlabを書いていますか?または、あなたのMATLABインストールからmexファイル、Cライブラリ、またはJavaオブジェクトにアクセスしていますか? – John

答えて

3

私はこの問題を考え出しました。フィギュアハンドルは隠されていて、close('all')は表示されているフィギュアでのみ機能します。私は数字が閉じようとしていた範囲外で数字が作られているので、彼らは隠れていると思います。解決策は、close('all')close all hiddenに置き換えることでした。これは、隠されたハンドルを含むすべての数字を閉じます。

私が先に行くと、@ジョンと@horchlerが彼らの提案は、同様の問題を持つ人々を助けることができる場合には、彼らのコメントで述べたものを修正再表示されます:

  • パフォーマンスを向上させると可能性を減らすことができ、既存の数値を再利用メモリリークのために。

  • Matlabにはパフォーマンス関連の問題のデバッグに役立つundocumented memory profilerがあります。

  • 無期限に実行されているプロセスの場合、データ収集/処理と製品生成(図など)を分けることをお勧めします。最初の人はデータを読み込んで処理し、DBまたはファイルに保存します。 2番目のオプションでは、データの表示/アクセス/クエリを実行できます。

  • コードでコンパイルされたmex関数を呼び出す場合、メモリリークはFortranまたはC/C++コードから発生している可能性があります。 1つの変数をクリーンアップしないと、リークが発生する可能性があり、線形メモリの増加を説明します。

  • Matlab関数whosは、ワークスペース内の各変数のメモリサイズを調べるのに最適です。これは、どの変数がメモリリークの原因であるかを追跡するのに便利です。

ありがとう@Johnと@horchler!

関連する問題