【问题标题】:Work with very large arrays in matlab在 matlab 中处理非常大的数组
【发布时间】:2016-11-09 20:19:32
【问题描述】:

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

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

我知道要扩大我的问题,我必须开始进行近似,但我很好奇如果我能避免这个内存使用错误,我能走多远。谢谢。

【问题讨论】:

  • 您是否将您的矩阵定义为sparseN 的典型值是多少?
  • N 大概是多少?

标签: arrays matlab memory memory-management


【解决方案1】:

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

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

如果您愿意牺牲准确性,您也可以尝试使用单精度数字而不是通常的双精度数(eigs() 不支持这一点,但外部求解器可能)。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      一切都存储在 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 的情况下启动 Matlab(这是一个 RAM 怪物),但这将以失去所有 Java 功能为代价,我不确定哪些功能您正在使用,因为我没有代码,但值得一试。

      5,您也可以考虑运行虚拟 RAM 并增加系统交换空间 - 这是可用作临时存储的潜在 512TB 磁盘空间 - 但此方法经常失败,不推荐使用。如果你使用SSD,它会负担很重,很快就会浪费掉。如果您使用的是 HDD,则会面临类似的威胁。

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

      【讨论】:

      • 有趣的是,我谦卑地等待反对的选民提供一个可行的解决方案,因为我不能:(
      【解决方案4】:

      当然你可以在 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);
      

      那么你就可以这样工作了

      【讨论】:

      • map reduce 不会减少所需的 RAM 量——它只会使用并行/多核加快处理速度——所以我不确定 Big Data Matlab 是否与此有关。除非您建议将其放在集群/云上以增加可用 RAM 量
      • 你说得对,我会改变分割的方法,你会赢,所以这就是我想在这里说的地图缩减的重点
      • 我只是说 OP 似乎有一个巨大的稀疏矩阵,他/她需要放入 RAM 中进行计算,并且他/她需要整个矩阵才能进行计算,并且没有更多的 RAM,似乎唯一的方法是更改​​计算函数以占用更少的 RAM——这意味着他需要某种定制的函数——或者某种估计来减少操作所需的 RAM 量或获得更多的 RAM I猜测。
      猜你喜欢
      • 2023-03-25
      • 1970-01-01
      • 2013-08-05
      • 2010-10-07
      • 1970-01-01
      • 1970-01-01
      • 2014-09-07
      相关资源
      最近更新 更多