雲雀は高く空を舞い このページをアンテナに追加 RSSフィード

「ひよこは高く空を舞い」について

2007-02-12

メモリの効率的な使用法  メモリの効率的な使用法 - 雲雀は高く空を舞い を含むブックマーク はてなブックマーク -  メモリの効率的な使用法 - 雲雀は高く空を舞い  メモリの効率的な使用法 - 雲雀は高く空を舞い のブックマークコメント

メモリ管理関数

  • whos, pack, clear, save, load, quit

保護したメモリの使用

変数の取り扱い

変数を作成する場合、メモリを保護するには、

  • 大きなテンポラリの変数を作成することを避け、必要なくなった場合、すぐにテンポラリ変数を削除します。
  • 固定したサイズの配列を取り扱う場合、大きくする必要が生じる度に、MATLAB でリサイズしないで、前もって割り当てておきます。
  • 空行列に等しい変数をフリーメモリに設定するか、または、<clear variable_name>を使って、クリアします。
  • できる限り、変数を再利用します。
メモリ内でデータの圧縮

MATLAB は、メモリ管理をヒープ方式で行なっているので、拡張したMATLAB セッションは、メモリを分断する原因になります。メモリが分断された場合、フリースペースの部分が多くなりますが、新しい大きな変数をストアするには、連続したフリーのスペースが十分でない場合が生じます。MATLAB から、Out of Memory メッセージが表示されると、pack 関数は、メモリ内のユーザのデータのいくつかを圧縮し、連続したフリーな空間を作成します。

セル配列に対して必要なメモリ

連続したフリーのメモリは、セル配列全体に対しては必要ありません。セル配列は、他の配列へのポインタの配列なので、個々の配列に対するメモリは、連続している必要がありますが、全体のメモリの収集には、連続している必要はありません。

配列の構造体と構造体の配列との比較

配列の構造体は、構造体の配列より、保存するためには、多くのメモリを必要としません。また、配列の構造体を使うことは、スピードの面でも利点を示します。

たとえば、つぎの配列の構造体を作成しましょう。

struct_of_array.A = magic(100);
struct_of_array.B = rand(100);

また、同じ次元をもち、配列の構造体と同じデータをもつ構造体の配列を作ります。

for m = 1:100
    for n = 1:100
        array_of_struct(m,n).A = struct_of_array.A(m,n);
        array_of_struct(m,n).B = struct_of_array.B(m,n);
    end
end

2つのメモリの使用量を比べて見ましょう。そして、構造体の配列は、同じデータを含む配列の構造体に対して、約8.5 倍のメモリを必要としています。

NameSizeBytesClass
array_of_struct100x1001360128struct array
struct_of_array1x1 160248struct array
入れ子になった関数セル

入れ子になっている関数で使われるメモリの量は、連結したライン上でこれらをコールして使う量の総量と同じです。つぎの2つの例題は、同じ量のメモリを必要とします。

result = function2(function1(input99));
result = function1(input99);
result = function2(result);
トラックバック - http://chick.g.hatena.ne.jp/allegro/20070212
テクノラティプロフィール