1

私は 2 つのハイパーパラメーター (x と y としましょう) を通過する非常に大規模なメタ シミュレーションを実行しており、ハイパーパラメーターの各セット (x_i & y_j) に対して適度なサイズのサブシミュレーションを実行しています。したがって:

for x=1:I
    for y=1:j
        subsimulation(x,y)
    end
end

ただし、各サブシミュレーションでは、データの約 50% が他のすべてのサブシミュレーション、つまり subsimulation(x_1,y_1).commondata=subsimulation(x_2,y_2).commondata に共通しています。

これまでのところ、シミュレーション結果の合計ファイル サイズは ~10Gb であるため、これは非常に重要です! 明らかに、スペースを節約するために、共通のサブシミュレーション データを 1 回保存したいと考えています。しかし、それを 1 か所に保存するという明白な解決策は、subsimulation(x,y).commondata を直接呼び出すため、私のプロット関数を台無しにしてしまいます。

subsimulation(x,y).commondata=% pointer to 1 location in memory % のようなことができるかどうか疑問に思っていました

それがうまくいかない場合は、次のエレガントではないソリューションはどうですか:

subsimulation(x,y).commondata='variable name' %string

そして追加

if(~isstruct(subsimulation(x,y).commondata)), 
    subsimulation(x,y).commondata=eval(subsimulation(x,y).commondata)
end

皆さんは、どのような解決策が最善だと思いますか?

ありがとうダンクマスターダン

4

2 に答える 2

2

これは、ハンドル クラスを定義することでかなり簡単に行うことができます。ドキュメントも参照してください。

例:

classdef SimulationCommonData < handle
    properties
        someData
    end

    methods
        function this = SimulationCommonData(someData)
            % Constructor
            this.someData = someData;
        end
    end
end

次に、このように使用します。

commonData = SimulationCommonData(something);
subsimulation(x, y).commondata = commonData;
subsimulation(x, y+1).commondata = commonData; 
% These now point to the same reference (handle)
于 2013-05-13T19:42:25.740 に答える
1

私のコメントによると、データを変更しない限り、commonそれを 3 番目の入力として渡すことができますが、反復ごとに配列をメモリにコピーすることはできません (非常に良い読み方は、Internal Matlab memory Optimizationsです)。この画像は次のことを明確にします。

ここに画像の説明を入力

ご覧のとおり、メモリ内の最初のジャンプは の作成によるものcommonで、2 番目のジャンプは output の割り当てによるものcです。データが反復ごとにコピーされた場合、さらに多くのメモリ変動が見られます。たとえば、3 回目のジャンプ、次に減少、そして再び戻るなど...

コードに従います(pauseループ中に大きなジャンプが発生しないことを明確にするために、各反復の間に a を追加しました):

function out = foo(a,b,common)
out = a+b+common;
end

for ii = 1:10; c = foo(ii,ii+1,common); pause(2); end
于 2013-05-13T20:11:01.270 に答える