1

我正在运行一个非常大的元模拟,其中我通过两个超参数(比如说 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次以节省空间。然而,显而易见的解决方案是将它保存在一个地方会搞砸我的绘图功能,因为它直接调用 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

你们认为什么解决方案最好?

感谢 DankMasterDan

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数据,您就可以将其作为第三个输入传递,并且仍然不会在每次迭代时将数组复制到内存中(非常好的阅读是Internal Matlab memory optimizations)。这张图片将阐明:

在此处输入图像描述

如您所见,内存中的第一次跳转是由于创建,common第二次跳转是由于 output 的分配c。如果每次迭代都复制数据,您会看到更多的内存波动。例如,第三次跳跃,然后下降,然后再次返回等等......

遵循代码(我pause在每次迭代之间添加了一个,以便更清楚地表明循环期间不会发生大的跳转):

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 回答