3

私は最近、Matlab の OOP を使用していくつかのコードを書きました。各クラス オブジェクトで、いくつかの測定データをプロパティとして保存し、それらを評価するメソッドを定義します。平均的なデータ セットでは、1 つのクラス オブジェクトが約 32 MB のメモリを使用します。現在、これらのオブジェクトを処理する GUI を作成しています。

最初のステップでは、保存された .mat ファイル (約 200 個のオブジェクト、ハードディスクに 2GB) から一連のオブジェクトを読み込み、handles 構造体に格納します。ロードすると、RAM がいっぱいになり、約 6 ~ 7 GB を使用します。これは問題ありません。

しかし、GUI を閉じると、使用済みメモリを解放できないようです。さまざまなアプローチを試みましたが、成功しませんでした。

クラスのデストラクタでデータ フィールドを「空」に設定します。

function delete(obj)
    obj.timeVector = [];
    obj.valueVector = [];
end

figure_CloseRequestFcn でそれを解放しようとしています:

function figure_CloseRequestFcn(hObject, eventdata, handles)
    handles.data = [];
    handles = rmfield(handles,'data');
    guidata(hObject,handles);
    clear handles;
    pack; %Matlab issues a warning, that pack could only 
          %be used from the command line, but that did
          %not work either
    delete(hObject);
end

GUIで作業した後、毎回Matlabを閉じる以外に、何かアイデアはありますか?

4

3 に答える 3

1

スクリーンショットに基づいて、memoryクリアされていないメモリが確実にあります。Matlab のガベージ コレクションに根本的な欠陥が見つかる可能性はわずかですが、一連のリンクを介して 6Gig のメモリ常駐データがまだ実際に利用可能である可能性ははるかに高くなります。個人的な経験に基づいて、消去されたと思っていたメモリがまだ利用できるいくつかの方法を次に示します。

  • タイマー オブジェクト: タイマーのコールバック関数の 1 つがこのデータ (またはコピー) を参照する場合、そのデータは引き続き使用できます。deleted(t)そのタイマーを呼び出す必要があります。

  • 関数内の永続変数: 関数内の永続変数にデータをキャッシュすることがよくあります。これにより、将来そのデータにアクセスできるようになるため、クリアされません。clear FUNCTIONNAME関連する永続変数をクリアするには、呼び出す必要があります。

  • GUI オブジェクトで、データとして、またはコールバック関数内で: Figure とすべての持続性をクリアする必要があります。

  • データを保持できるクラスの静的メソッドまたは定数属性。これらは、クラス内で個別にクリアすることも、 を使用して強制的にクリアすることもできますclear CLASSNAME

データへの古いリンクを見つけるためのヒント (個人的な間違いに基づく)

  • 呼び出しを使用して正確な数を取得し、各呼び出しの後に失われる正確なバイト数を調べx=memory;ます。それは一貫していますか?わかる数字ですか?正確に 238263232 バイトであること、したがって 29782904 倍精度配列であることを認識した後、リークを見つけることができる場合があります。これは、関数 xyz からのものでなければなりません。

  • 実際に削除されているクラスを確認します。関数内にdelete(obj)詳細な表示を追加するか、どのオブジェクトが削除されているか、および推論によってどのオブジェクトが削除されていないかを追加します。特定の削除されていないオブジェクトの場合、どこから参照できますか? delete(obj)あなたが行っているように、関数内のデータをクリアする必要はありません。Matlab がそれを処理する必要があります。delete代わりに、この関数をデバッグ ツールとして使用してください。

于 2013-02-12T18:35:56.880 に答える
-1

Matlabにはガベージコレクターがあるため、手動でメモリを管理する必要はありません。GUIを閉じると、ワークスペースにあるものを除いて、すべてのメモリが解放されます。を使用してワークスペース変数をクリアできますclear

Windowsで私が気づいたことの1つ(他のプラットフォームについてはわかりません)は、MatlabのGUIが余分なメモリを保持することがあることです(おそらく100 MBですが、あなたが見ているように複数のGBではありません)。GUIを最小化してから復元するだけで、この余分なメモリが解放されます。

于 2013-02-12T13:59:01.537 に答える