在matlab中使用非常大的数组

时间:2016-07-07 13:26:27

标签: arrays matlab memory memory-management

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

我相信matlab会对矩阵进行对角化。这个矩阵必须存储在RAM内存中,我可以存储矩阵“chunk by chunk”所以我最终在我的存储驱动器上的文件上放了一个非常大的矩阵,然后,如果可能的话,逐步对齐它(如果我可以把它变换成方框对角矩阵)。这是一个很好的方法吗?

我知道为了扩大我的问题,我必须开始制作aproximations但我很好奇,如果我可以避免这种内存使用错误,我能走得多远。感谢。

4 个答案:

答案 0 :(得分:1)

如果您可以访问Parallel Computing Toolbox和群集,则可以将数据存储在distributed数组中。数组的内容将分布在集群中机器的内存中;然而,它会在您的客户端MATLAB上显示为单个变量。

eig适用于分布式数组和常规数组。

答案 1 :(得分:0)

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

Big data 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);

那么你可以像这样工作

答案 2 :(得分:0)

确保您的矩阵被声明为稀疏,并使用明确设计用于处理稀疏矩阵的特征值求解器。内置eigs()就是一个例子,也可以使用其他解算器。例如,PROPACK被明确设计用于解决大的稀疏问题(当矩阵是对称的时,SVD或特征值分解)。不要求比实际需要更多的特征值(指定您是想要最大还是最小)。 eigs()也可以将函数作为输入而不是矩阵,其中函数返回作用于给定向量的矩阵的结果。您可以使用它来减少内存。例如,如果您的矩阵具有一些已知结构,可用于计算此函数而无需显式表示矩阵。或者,您可能能够设置一种方法将矩阵存储在磁盘上,并一次只加载部分矩阵来计算此功能(但您需要花时间)。

如果解决特征值问题只是其他问题的一个步骤,那么在某些情况下可能会避免它。例如,可以使用协方差矩阵的特征分解来求解PCA。但是,在某些情况下,以另一种方式解决它(例如在线更新/增量学习,或使用SVD)会更有效(在时间和内存方面)。如果这适用于您的问题,则值得研究。

如果你愿意牺牲精确度,你也可以尝试使用单精度数而不是通常的双精度数(eigs()不支持这个,但外部解算器可能会这样做。) / p>

答案 3 :(得分:-1)

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

1,如果您的数据是Ints或某些数据形式比Double(Float)占用更少的空间。您可以考虑将其转换为uint8或其他的矩阵。

2,购买更多内存

有趣的替代方案是download more RAM

还要检查您使用的内存:

[userview systemview] = memory

3,也许你可以关闭一些正在运行的进程(除了Matlab)来为Matlab(JVM)释放一些内存。此外,在Matlab中,删除您不需要的任何变量(或保存它们,然后使用clear删除它们)。

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

5,您也可以考虑运行虚拟RAM和增加系统交换空间 - 这可能是512TB的磁盘空间可用作临时存储 - 但这种方法经常失败,不建议使用。如果你使用SSD,它将承担沉重的负担并立即浪费它。如果您使用HDD,则会遇到类似的威胁。

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