Arrays 在matlab中使用超大阵列

Arrays 在matlab中使用超大阵列,arrays,matlab,memory,memory-management,Arrays,Matlab,Memory,Memory Management,我目前正在研究一个问题,这个问题涉及到获取非常大的矩阵的特征值。矩阵是稀疏矩阵,为NxN,元素介于N和2N之间。我的问题是matlab内存不足,但计算似乎不是很难(我能做的最大的例子持续不到5秒),因此,由于计算时间似乎不是一个问题,我想也许这个内存问题可以通过一些技巧解决,我还不知道 我相信matlab可以将矩阵对角化。这个矩阵必须存储在RAM内存中,我是否可以“逐块”存储一个矩阵,这样我就可以在存储驱动器上的一个文件上得到一个非常大的矩阵,然后,如果可能的话,一步一步地对其进行对角化(如果我

我目前正在研究一个问题,这个问题涉及到获取非常大的矩阵的特征值。矩阵是稀疏矩阵,为NxN,元素介于N和2N之间。我的问题是matlab内存不足,但计算似乎不是很难(我能做的最大的例子持续不到5秒),因此,由于计算时间似乎不是一个问题,我想也许这个内存问题可以通过一些技巧解决,我还不知道

我相信matlab可以将矩阵对角化。这个矩阵必须存储在RAM内存中,我是否可以“逐块”存储一个矩阵,这样我就可以在存储驱动器上的一个文件上得到一个非常大的矩阵,然后,如果可能的话,一步一步地对其进行对角化(如果我可以将其转换为长方体对角矩阵)。这是个好办法吗


我知道,为了扩大我的问题,我必须开始做一个估计,但我很好奇,如果我能避免这个内存使用错误,我能走多远。谢谢。

所有内容都存储在Matlab中的RAM中,除非您可以在不查看整个矩阵的情况下执行计算-否则您将面临RAM问题。我的建议是:

1,如果您的数据是整数或比Double(Float)占用更少空间的数据形式。您可以考虑将其转换为UTI8或某个矩阵的矩阵。 2、多买些RAM

有趣的选择是

还要检查您正在使用的内存量:

[userview systemview] = memory
3,也许您可以关闭正在运行的某些进程(而不是Matlab),为Matlab(JVM)释放一些内存。另外,在Matlab中,删除您不需要的任何变量(或者保存它们,然后使用
清除
)删除它们)

4、如果您使用的是Unix
-nojvm
,那么在没有JVM的情况下启动Matlab是可能的(JVM是一个RAM怪物),但这将以丢失所有Java功能为代价,我不确定您正在使用哪些功能,因为我没有代码,但值得一试

5,您也可以考虑运行虚拟RAM并增加系统交换空间——这是可以用作临时存储的潜在的512TB磁盘空间,但是这种方法经常失败并且不推荐使用。如果你使用SSD,它会在任何时候都造成沉重的负担和浪费。如果您使用的是HDD,则会运行类似的威胁


但我担心所有这些方法都无法从根本上解决您的问题——因为在大数据领域,数据只会变得更大,没有更大的RAM,您唯一的其他方法是通过估算或更有效的RAM计算过程(这很棘手不是吗?)。因此,如果您的数据变得更大,也许使用云簇,您可以拥有几乎无限的RAM,这可能是最好的解决方案。

所有内容都存储在Matlab的RAM中,除非您可以在不查看整个矩阵的情况下执行计算-您无论如何都将面临RAM问题。我的建议是:

1,如果您的数据是整数或比Double(Float)占用更少空间的数据形式。您可以考虑将其转换为UTI8或某个矩阵的矩阵。 2、多买些RAM

有趣的选择是

还要检查您正在使用的内存量:

[userview systemview] = memory
3,也许您可以关闭正在运行的某些进程(而不是Matlab),为Matlab(JVM)释放一些内存。另外,在Matlab中,删除您不需要的任何变量(或者保存它们,然后使用
清除
)删除它们)

4、如果您使用的是Unix
-nojvm
,那么在没有JVM的情况下启动Matlab是可能的(JVM是一个RAM怪物),但这将以丢失所有Java功能为代价,我不确定您正在使用哪些功能,因为我没有代码,但值得一试

5,您也可以考虑运行虚拟RAM并增加系统交换空间——这是可以用作临时存储的潜在的512TB磁盘空间,但是这种方法经常失败并且不推荐使用。如果你使用SSD,它会在任何时候都造成沉重的负担和浪费。如果您使用的是HDD,则会运行类似的威胁


但我担心所有这些方法都无法从根本上解决您的问题——因为在大数据领域,数据只会变得更大,没有更大的RAM,您唯一的其他方法是通过估算或更有效的RAM计算过程(这很棘手不是吗?)。因此,如果您的数据越来越大,也许使用云集群(其中您可以拥有几乎无限的RAM)是最好的解决方案。

当然,您可以在matlab中使用matlab文件中的大对象,并按部分工作,matlab有许多用于处理大数据的有用工具:

在您的情况下,您可以按如下方式工作(始终应该类似于mapreduce算法)

可以将变量保存在mat文件中

A = rand(5);
B = magic(10);
save example.mat A B -v7.3;
clear A B
构造一个matlab.io.MatFile对象,该对象可以从文件example.mat加载部分变量

example = matfile('example.mat')

example = 

  matlab.io.MatFile

  Properties:
      Properties.Source: C:\Documents\MATLAB\example.mat
    Properties.Writable: false           
                      A: [5x5   double]  
                      B: [10x10 double]  
将example.mat中B的第一列加载到变量firstColB中

firstColB = example.B(:,1);

然后您可以这样工作

当然,您可以在matlab中使用matlab文件中的大对象,并按部分工作,matlab有许多用于处理大数据的有用工具:

在您的情况下,您可以按如下方式工作(始终应该类似于mapreduce算法)

可以将变量保存在mat文件中

A = rand(5);
B = magic(10);
save example.mat A B -v7.3;
clear A B
构造一个matlab.io.MatFile对象,该对象可以从文件example.mat加载部分变量

example = matfile('example.mat')

example = 

  matlab.io.MatFile

  Properties:
      Properties.Source: C:\Documents\MATLAB\example.mat
    Properties.Writable: false           
                      A: [5x5   double]  
                      B: [10x10 double]  
将example.mat中B的第一列加载到变量firstColB中

firstColB = example.B(:,1);

然后您可以像这样工作

如果您可以访问并行计算工具箱和集群,您可以将数据存储在分布式
阵列中。数组的内容将分布在集群中机器的内存中;尽管如此,在您的客户机MATLAB上,它将作为单个变量出现


eig
既可用于分布式阵列,也可用于常规阵列。

如果您可以访问并行计算工具箱和集群,则可以将数据存储在