';内存不足';在Matlab中。缓慢但永久的解决方案?
我想知道我对“记忆不足”问题的建议是否不可能。以下是我的建议: 其思想是,当无法将大型矩阵保存在内存中并在需要时无缝调用它时,将其作为.mat(-v7.3)文件无缝地保存到硬盘中(比如';内存不足';在Matlab中。缓慢但永久的解决方案?,matlab,memory,Matlab,Memory,我想知道我对“记忆不足”问题的建议是否不可能。以下是我的建议: 其思想是,当无法将大型矩阵保存在内存中并在需要时无缝调用它时,将其作为.mat(-v7.3)文件无缝地保存到硬盘中(比如BIG=rand(10^6))。然后,当您想像这样使用它时: a = BIG(3678,2222); s = size(BIG); ,它可以在幕后无缝地执行以下操作: m = matfile('BIG.m'); a = m.BIG(3678,2222); s = size(m,'BIG'); 我知道速度很重要,
BIG=rand(10^6)
)。然后,当您想像这样使用它时:
a = BIG(3678,2222);
s = size(BIG);
,它可以在幕后无缝地执行以下操作:
m = matfile('BIG.m');
a = m.BIG(3678,2222);
s = size(m,'BIG');
我知道速度很重要,但假设我有足够的时间但没有足够的记忆。写一个内存效率高的程序也更好,但是再次假设我需要使用其他人无法优化的函数。我确实有一些更相关的问题:这可以用对象实现吗?还是需要在Matlab中更改基础结构?编写一个函数:
function a=BIG(x,y)
m = matfile('BIG.mat');
a = m.BIG(x,y);
end
每次编写BIG(a,b)
时,都会调用该函数。编写一个函数:
function a=BIG(x,y)
m = matfile('BIG.mat');
a = m.BIG(x,y);
end
每次编写
BIG(a,b)
时,函数都会被调用。在我看来,这当然是可能的,因为这本质上是许多操作系统以
此外,MATLAB分布式计算服务器也提供了类似的功能。这允许您(除其他外)在多台机器上存储单个矩阵的数据,并以您建议的方式无缝地访问它
IMHO,允许数据分页到文件/交换应该是MATLAB中的一个设置。不幸的是,MATLAB的内存模型并不是这样工作的,我怀疑在他们这方面很难实现这一点。此外,启用此设置后,用户将不再受到保护,不会再犯愚蠢的错误,如zero(1e7)
而不是zero(1e7,1)
;它似乎只是挂起了系统,因为MATLAB正忙着用零填充整个驱动器
无论如何,我认为使用MATLAB类是可能的。但我不推荐。请注意,实现适当的subsref
和subsasgn
具有挑战性,此外,您可能需要重新实现许多算法(如mldivide
)。这很可能意味着您将失去大量的性能;想想成千上万的因素吧
这是我在谷歌搜索时发现的一个有趣的问题。在我看来,这当然是可能的,因为这本质上是许多操作系统以 此外,MATLAB分布式计算服务器也提供了类似的功能。这允许您(除其他外)在多台机器上存储单个矩阵的数据,并以您建议的方式无缝地访问它 IMHO,允许数据分页到文件/交换应该是MATLAB中的一个设置。不幸的是,MATLAB的内存模型并不是这样工作的,我怀疑在他们这方面很难实现这一点。此外,启用此设置后,用户将不再受到保护,不会再犯愚蠢的错误,如
zero(1e7)
而不是zero(1e7,1)
;它似乎只是挂起了系统,因为MATLAB正忙着用零填充整个驱动器
无论如何,我认为使用MATLAB类是可能的。但我不推荐。请注意,实现适当的subsref
和subsasgn
具有挑战性,此外,您可能需要重新实现许多算法(如mldivide
)。这很可能意味着您将失去大量的性能;想想成千上万的因素吧
这是我在谷歌搜索时发现的一个有趣的问题。解决您问题的可能方法是内存映射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
matfile,这将非常有用。这可能因为压缩而变得困难。解决问题的方法可能是内存映射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
matfile,这将非常有用。这可能因为压缩而困难。可能与r有关