';内存不足';在Matlab中。缓慢但永久的解决方案?

';内存不足';在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'); 我知道速度很重要,

我想知道我对“记忆不足”问题的建议是否不可能。以下是我的建议:

其思想是,当无法将大型矩阵保存在内存中并在需要时无缝调用它时,将其作为.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');
我知道速度很重要,但假设我有足够的时间但没有足够的记忆。写一个内存效率高的程序也更好,但是再次假设我需要使用其他人无法优化的函数。我确实有一些更相关的问题:这可以用对象实现吗?还是需要在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有关