在matlab中存储和处理大数据

Store and process big data in matlab

我想做一个马尔可夫链 Monte Carlo 模拟。因此我需要存储生成的状态。问题是我想 运行 我的程序一段时间并生成很多状态,但 MATLAB 向我显示 'OUT OF MEMORY' 错误。因为我不需要一直知道状态的完整历史(我只需要前面的状态来生成下一个状态),所以我想我可以在每 10000 次迭代步骤后存储生成的状态,只保留最后一个。然后最后我想做一些计算,例如均值、方差并绘制生成数据的直方图,并最终用大数据图绘制数据:http://de.mathworks.com/matlabcentral/fileexchange/40790-plot-big

我生成一个结构,存储维数和一个向量,其坐标根据此维和另一个相同大小的向量。初始化之后,我使用 for 循环生成我的以下马尔可夫链

state(1) = struct('dim', 3 ,'coords',rand(3,1), 'vals', rand(3,1));
state(10000) = struct('dim', [], 'coords', [], 'vals', []);
for i = 2:10000
state(i) = generateNewState(state(i-1));
end

如何存储生成的状态数据并继续处理接下来的 10000 个状态。然后将它们附加到现有的 .mat 文件并继续,直到我生成 1e10 状态。然后用数据做计算?

我得到的第一个想法: 1.也许你可以在每一步都计算出你需要的所有变量? 例如:

n = 10000;
for i = 1:n
state = generateNewState(stateOld);
mean = mean + state/n;
stateOld = state;
end;

这让您可以在不保存所有状态值的情况下计算均值。 你可以用直方图做同样的事情:如果你现在的直方图的轴值你可以创建数组并计算在这一步进入哪个间隔状态:

if (state < 0.1 )
inter1 = inter1 + 1;
elseif (state < 0.2)
inter2 = inter2 + 1;
...

这是很多代码,但这行得通。 等等等等。 2. 第二种方式:你可以计算前10000步,保存在excel(xlswrite函数),然后使用循环重写状态值增加i。在这种情况下,您保存所有值并将以相同的方式将其加载回来。 你可以看到我使用状态 double 而不是 struct,但它很容易实现 struct.

好吧,这是很久以前的事了,但也许它仍然会对某些人有所帮助。我通过不使用 .mat 文件解决了我的问题,而是将结构写入 csv-file。我创建了一个格式化字符串,它生成了一个表格格式,并根据该字符串将结构元素写入我的带有 fprintf() 的 csv 文件中。但在此之前,我必须将我的结构数组转换为元胞数组,以便能够轻松访问我的结构内容。为此,我使用了 struct2table(),然后是 table2cell(),这样我就获得了一些元胞数组 temp,然后我调用了 fprintf(fid, FormatString, temp{:})。正确执行它将导致 header 并且在每一行中一个马尔可夫状态和马尔可夫状态的每个维度将有一个单独的列。

在模拟之后,我使用 Matlab 中的 MapReduce 技术来处理我的 csv 文件。所以基本上我用 map 和 reduce 算法遍历数据,根据均值、方差、计数、最小和最大统计数据进行计算。之后,我使用 min 和 max 为我的直方图定义 bin 边缘,并第二次遍历我的数据以使用相应的 MapReduce 算法计算 bin 计数。由于这些算法被设计为并行工作,因此通过我的数据迭代 2 次没有问题,该数据由大约 5000 万个马尔可夫链状态组成,其中每个状态可能有数百个维度。这更多是存储问题,因为 csv 文件中的数据将达到 10 GB 或更多。所以在使用 FAT 或 FAT32 格式的硬盘驱动器时应该小心......当然有更聪明的存储数据的方法,但我选择了 csv 文件,因为它们可以在 MATLAB 的帮助下处理MapReduce 算法。

最后我无法使用plot-big从file-exchange,但我不难提取一列数据,通常内存还可以。有了这一列,它描述了每个马尔可夫状态的相应维度,我们可以通过绘制每 1000 个左右的元素来绘制这个维度的演变。保存图形并关闭它以减少 PC 的工作量,然后对每个维度重复此操作,以获得模拟数据的概览。 希望对你有帮助。