Matlab中的“内存不足”。缓慢但永久的解决方案?

时间:2013-12-12 12:17:43

标签: matlab memory

我想知道我对“内存不足”问题的建议是否不可能。这是我的建议:

这个想法是将大型矩阵(比如BIG = rand(10^6))无缝地保存到HDD作为.mat(-v7.3)文件,因为无法将其保存在内存中并在需要时无缝调用。然后,当你想使用它时:

a = BIG(3678,2222);
s = size(BIG);

,它在幕后无缝地完成:

m = matfile('BIG.m');
a = m.BIG(3678,2222);
s = size(m,'BIG');

我知道速度很重要但是假设我有足够的时间但没有足够的记忆力。而且编写一个内存高效的程序也更好,但再次假设我需要使用其他人无法优化的功能。我确实有一些更相关的问题:这可以使用对象实现吗?或者它是否需要在Matlab中进行基础设施更改?

3 个答案:

答案 0 :(得分:4)

在我看来,这肯定是可能的,因为这基本上是许多操作系统以paging的形式所做的事情。

此外,MATLAB Distributed Computing Server提供了类似的功能。这允许您(除其他外)在多台计算机上存储单个矩阵的数据,并以您建议的方式无缝访问它。

恕我直言,允许将数据分页到文件/交换应该是MATLAB中的设置。不幸的是,这不是MATLAB的内存模型的工作原理,我怀疑它们很难实现这一点。此外,启用此设置后,用户将不再受到保护,不会再犯zeros(1e7)而非zeros(1e7,1)这样的愚蠢错误;它似乎只是挂起系统,因为MATLAB忙于用零填充你的整个驱动器。

无论如何,我认为可能使用MATLAB类。但我不推荐它。请注意,实施适当的subsrefsubsasgn是* ahum * 具有挑战性 ,此外,您可能需要重新审核 - 实现许多算法(如mldivide)。这很可能意味着你将失去很多表现;想想成千上万的因素。

这是一个有趣的random relevant paper我在谷歌搜索时找到了。

答案 1 :(得分:2)

你的问题的解决方案可能是内存映射io(matlab支持)。

文件被映射到内存,并且对该内存地址的所有读/写实际上都是对文件的读/写。

这只保留/阻止内存地址,不消耗物理内存。

但是,我只建议使用64位matlab,因为使用32位matlab时,地址空间不足以使用ram进行数据,matlab和dll代码以及内存映射io。

查看memmapfile()文档页面的示例,例如

m = memmapfile('records.dat',    ...
           'Offset', 1024,   ...
           'Format', {'uint32' [4 10 18] 'x'});

A = m.Data(1).x;

whos A
   Name      Size                     Bytes  Class

   A        4x10x18                   2880   uint32 array

请注意,访问m.Data(1).x重定向到文件IO,即不消耗内存。因此,它可以有效地随机访问驻留在磁盘上的部分可能非常大的数据文件。另请注意,可以实现示例中更复杂的数据结构。

在我看来,这提供了你想到的“实现对象”。

不幸的是,这不允许直接memmap MATfiles,这将非常有用。由于压缩,这可能很难。

答案 2 :(得分:0)

写一个函数:

function a=BIG(x,y)
  m = matfile('BIG.mat');
  a = m.BIG(x,y);
end

每次编写BIG(a,b)时,都会调用该函数。