MATLABで変数によって使用される実際のメモリを確認するにはどうすればよいですか?

クリス・ルエンゴ

MATLABのコピーオンライト(レイジーコピー)メカニズムを使用して、セル配列内の複数のセルから同じ大きな行列をリンクしようとしたときに、正しく実行されているかどうかを確認する方法があるかどうか疑問に思っています。

例えば:

img = randn(500);
[dx,dy] = gradient(img);
S = cell(2,2);
S{1,1} = dx.^2;
S{2,2} = dy.^2;
S{1,2} = dx.*dy;
S{2,1} = S{1,2};  % should be a reference, as long as not modified

しかし、の出力を見てくださいwhos

>> whos
  Name        Size               Bytes  Class     Attributes

  S           2x2              8000448  cell                
  dx        500x500            2000000  double              
  dy        500x500            2000000  double              
  img       500x500            2000000  double              

私はS8MBではなく6MB占めることを望んでいました

プログラムに間違いがなく、それらの2つのセルが最後に同じ配列を参照していることを確認する方法はありますか?

私はその機能を知っていますmemoryが、残念ながらWindowsプラットフォームでしか機能しません(私はMacOSを使用しています)。

rahnema1

編集:

回答を編集する前に、予期しない動作をし、その署名が異なるバージョンのMATLAB間で安定していない、文書化されていない関数を使用したので、ここで@CrisLuengoの回答の拡張バージョンを提供しました。

ハッシュマップを使用して、データ要素とそれに関連するmxArray一意のアドレスを再帰関数check_sharedに格納し、データのサイズを取得できます。ここでは、セル内の共有ステータスを確認できますが、セルの外部にあり、セル要素と同じアドレスを持つ要素を確認することはできません。*

#include "mex.h"
#include <unordered_map>
typedef std::unordered_map<void *,const mxArray *> TableType;

TableType check_shared(const mxArray* arr, TableType table = TableType())
{
    switch (mxGetClassID(arr)) {
        case mxCELL_CLASS:
            for(int i = 0; i < mxGetNumberOfElements (arr); i++) {
                table  = check_shared(mxGetCell (arr,i), std::move(table));
            }
            break;
        case mxSTRUCT_CLASS:
            for (int i = 0; i < mxGetNumberOfFields (arr); i++) {
                for (int j = 0; j < mxGetNumberOfElements (arr); j++) {
                    table = check_shared(mxGetFieldByNumber (arr, j, i), std::move(table));
                }
            }
            break;
        case mxVOID_CLASS:
        case mxFUNCTION_CLASS:
        case mxUNKNOWN_CLASS:
            return table;
    }
    if (!mxIsEmpty (arr)) {
        void* data = mxGetData(arr);
        table[data] = arr;
    }
    return table;
}
uint64_t actual_size(const TableType& table)
{
    uint64_t sz = 0;
    for (const auto& entry : table) {
        const mxArray * arr = entry.second;
        sz += mxGetElementSize (arr) * mxGetNumberOfElements (arr);
    }
    return sz;
}

void mexFunction(int nlhs, mxArray *plhs[],
                 int nrhs, const mxArray *prhs[])
{
    TableType table = check_shared(prhs[0]);
    plhs[0] = mxCreateNumericMatrix(1,1, mxUINT64_CLASS, mxREAL );
    uint64_t* result = static_cast<uint64_t*>(mxGetData (plhs[0]));
    result[0] = actual_size(table);
}

(*)などの基本的なデータ型cellstructおよび数値配列がサポートされています。不明なデータ構造とclassdefオブジェクトの場合、関数はゼロを返します。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

実際のメモリ使用量でソートされた上位プロセスを確認するにはどうすればよいですか?

分類Dev

URIによって作成されたBitmapImageが実際に画像であるかどうかを確認するにはどうすればよいですか?

分類Dev

環境変数が設定されているが実際に存在することを確認するにはどうすればよいですか?

分類Dev

スコープ変数に実際にNaNが含まれているかどうかを確認するにはどうすればよいですか?

分類Dev

matlab変数がどの構造に格納されているかを確認するにはどうすればよいですか?

分類Dev

Azure App Serviceのメモリ使用量を確認するにはどうすればよいですか?

分類Dev

Elixirのメモリ使用量を確認するにはどうすればよいですか?

分類Dev

bash関数に実際に渡される引数の数を確認するにはどうすればよいですか?

分類Dev

LoadRunnerテストスクリプトが実際に実行されていることを確認するにはどうすればよいですか?

分類Dev

実際のディスク使用量を確認するにはどうすればよいですか?

分類Dev

更新によってXamarinを使用したSQLITEが変更されたかどうかを確認するにはどうすればよいですか?

分類Dev

例によってスタックのメモリアドレス指定を確認するにはどうすればよいですか?

分類Dev

どのファイルが単にハードリンクされたか、実際に `rsync`によってコピーされたかを確認するにはどうすればよいですか?

分類Dev

Tomcatサーバーによって処理されたリクエストの総数を確認するにはどうすればよいですか?

分類Dev

Intellij Ideaで実行されている実際のコマンド(java)を確認するにはどうすればよいですか?

分類Dev

変数がすべての子クラスで使用されていることを確認するにはどうすればよいですか?

分類Dev

どのgemsetrbenvが使用されているかを確認するにはどうすればよいですか?

分類Dev

XSLで複数の変数が同じ値を持っているかどうかを確認するにはどうすればよいですか?

分類Dev

メモリ割り当て機能によってint変数とshort変数のサイズを測定するにはどうすればよいですか?

分類Dev

コレクション内のどの変数が使用されているかを確認するにはどうすればよいですか?

分類Dev

複数のコアが指定されているslurmジョブで、実際に使用されているコア/ CPUの数を確認するにはどうすればよいですか?

分類Dev

Laravelでメモリ使用量を確認するにはどうすればよいですか?

分類Dev

PythonアプリがAWS Lambda関数内で実行されているかどうかを確認するにはどうすればよいですか?

分類Dev

スクリプトが使用したCPUの実際の数を確認するにはどうすればよいですか?

分類Dev

関数が `lambda`または` def`によって宣言されているかどうかを確認するにはどうすればよいですか?

分類Dev

警告なしに複数のansible変数が定義されているかどうかを確認するにはどうすればよいですか?

分類Dev

指定された要素のみがリストに残っているかどうかを確認するにはどうすればよいですか?

分類Dev

certbotによって作成されたSSL証明書のすべてのドメインを確認するにはどうすればよいですか?

分類Dev

Mockitoを使用して特定のメソッドが呼び出されなかったことを確認するにはどうすればよいですか?

Related 関連記事

  1. 1

    実際のメモリ使用量でソートされた上位プロセスを確認するにはどうすればよいですか?

  2. 2

    URIによって作成されたBitmapImageが実際に画像であるかどうかを確認するにはどうすればよいですか?

  3. 3

    環境変数が設定されているが実際に存在することを確認するにはどうすればよいですか?

  4. 4

    スコープ変数に実際にNaNが含まれているかどうかを確認するにはどうすればよいですか?

  5. 5

    matlab変数がどの構造に格納されているかを確認するにはどうすればよいですか?

  6. 6

    Azure App Serviceのメモリ使用量を確認するにはどうすればよいですか?

  7. 7

    Elixirのメモリ使用量を確認するにはどうすればよいですか?

  8. 8

    bash関数に実際に渡される引数の数を確認するにはどうすればよいですか?

  9. 9

    LoadRunnerテストスクリプトが実際に実行されていることを確認するにはどうすればよいですか?

  10. 10

    実際のディスク使用量を確認するにはどうすればよいですか?

  11. 11

    更新によってXamarinを使用したSQLITEが変更されたかどうかを確認するにはどうすればよいですか?

  12. 12

    例によってスタックのメモリアドレス指定を確認するにはどうすればよいですか?

  13. 13

    どのファイルが単にハードリンクされたか、実際に `rsync`によってコピーされたかを確認するにはどうすればよいですか?

  14. 14

    Tomcatサーバーによって処理されたリクエストの総数を確認するにはどうすればよいですか?

  15. 15

    Intellij Ideaで実行されている実際のコマンド(java)を確認するにはどうすればよいですか?

  16. 16

    変数がすべての子クラスで使用されていることを確認するにはどうすればよいですか?

  17. 17

    どのgemsetrbenvが使用されているかを確認するにはどうすればよいですか?

  18. 18

    XSLで複数の変数が同じ値を持っているかどうかを確認するにはどうすればよいですか?

  19. 19

    メモリ割り当て機能によってint変数とshort変数のサイズを測定するにはどうすればよいですか?

  20. 20

    コレクション内のどの変数が使用されているかを確認するにはどうすればよいですか?

  21. 21

    複数のコアが指定されているslurmジョブで、実際に使用されているコア/ CPUの数を確認するにはどうすればよいですか?

  22. 22

    Laravelでメモリ使用量を確認するにはどうすればよいですか?

  23. 23

    PythonアプリがAWS Lambda関数内で実行されているかどうかを確認するにはどうすればよいですか?

  24. 24

    スクリプトが使用したCPUの実際の数を確認するにはどうすればよいですか?

  25. 25

    関数が `lambda`または` def`によって宣言されているかどうかを確認するにはどうすればよいですか?

  26. 26

    警告なしに複数のansible変数が定義されているかどうかを確認するにはどうすればよいですか?

  27. 27

    指定された要素のみがリストに残っているかどうかを確認するにはどうすればよいですか?

  28. 28

    certbotによって作成されたSSL証明書のすべてのドメインを確認するにはどうすればよいですか?

  29. 29

    Mockitoを使用して特定のメソッドが呼び出されなかったことを確認するにはどうすればよいですか?

ホットタグ

アーカイブ