我想知道我对“内存不足”问题的建议是否不可能。这是我的建议:
这个想法是将大型矩阵(比如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中进行基础设施更改?
答案 0 :(得分:4)
在我看来,这肯定是可能的,因为这基本上是许多操作系统以paging的形式所做的事情。
此外,MATLAB Distributed Computing Server提供了类似的功能。这允许您(除其他外)在多台计算机上存储单个矩阵的数据,并以您建议的方式无缝访问它。
恕我直言,允许将数据分页到文件/交换应该是MATLAB中的设置。不幸的是,这不是MATLAB的内存模型的工作原理,我怀疑它们很难实现这一点。此外,启用此设置后,用户将不再受到保护,不会再犯zeros(1e7)
而非zeros(1e7,1)
这样的愚蠢错误;它似乎只是挂起系统,因为MATLAB忙于用零填充你的整个驱动器。
无论如何,我认为可能使用MATLAB类。但我不推荐它。请注意,实施适当的subsref
和subsasgn
是* 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)
时,都会调用该函数。