【问题标题】:Multiplying two large matrices in matlab produces out of memory error在matlab中将两个大矩阵相乘会产生内存不足错误
【发布时间】:2012-05-28 04:39:20
【问题描述】:

我有两个需要相乘的大矩阵:

A×D

其中 A = 2358048 x 1 B = 1 x 492020

我知道乘法需要大量的 RAM,这就是为什么我在 matlab 中出现内存不足的原因(我在服务器上有 90GB 的 RAM 可用)。

有没有办法通过几个步骤完成。也许分解一些方法并将部分保存在一些文件中并逐步进行乘法运算。然后最后将它们结合在一起?示例 matlab 代码将是最有价值的。谢谢

【问题讨论】:

标签: matlab matrix sparse-matrix matrix-multiplication out-of-memory


【解决方案1】:

完整的产品将是 2358048 x 492020,这意味着它有 1,160,206,776,960 个元素。如果将它们存储在 float32 中,则数据量超过 4 TB。你确定你需要完整的矩阵吗?无论如何,您肯定不会将其加载到 RAM 中。

由于它只是两个巨大向量的外积,因此很容易根据需要找到任何给定的子元素:如果 C = AB,则 C(i, j) = A(i, 1) * B(1, j)。你需要对矩阵做的大部分事情都可以这样完成,也许可以根据需要即时计算产品的块,而不是存储整个巨大的东西。

您需要使用该产品做什么?

如果出于某种原因您确实需要将整个巨大的东西写入磁盘,那么很容易循环 A 并一次将一行写入某个文件(仅A(i,1) * B),或者循环 B 并写入一个一次列 (B(1,i) * A)。

【讨论】:

  • 正如我所指出的,我了解内存问题。我需要一个解决方法。也许有一种方法可以以某种方式将其分解成更小的块
  • 您说您“了解乘法需要大量 RAM”。但是忽略乘法过程,最终结果将是巨大的,而且它不会远程放入您机器的 RAM 中。那么任何涉及“最终将它们结合在一起”的东西?不会工作。不过,正如我在回答中指出的那样,分手很容易:具体如何取决于你需要对最终矩阵做什么。
  • 谢谢。我正在使用它进行预测分析。本质上,我分解了一个大的 5D 张量(308 x 22 x 29 x 12 x 492020)。然后我尝试通过将分解的维度相乘来重建它。在最后一步中,我将张量矩阵化,以便能够将其乘以最后一维 1 x 492020。一旦乘以,我需要以某种方式将产品转换回张量。有什么想法吗?
  • 你是如何存储张量的,因为它本身就是 4 TB?或者您是否试图以这种方式从某些组件中生成它?在任何情况下,RAM 中张量的显式完整表示都是不可能的,如果这种分解有效,我建议保持原样并根据需要计算子块。
  • 它在matlab中保存得很好。我正在使用张量工具箱。从 csv 文件创建张量我没有问题。在 HPC 服务器上分解只用了 4 分钟。此外,在重建过程中将前四个维度相乘也没有问题。这是失败的最后一步。
猜你喜欢
  • 1970-01-01
  • 2018-04-08
  • 1970-01-01
  • 1970-01-01
  • 2019-07-23
  • 1970-01-01
  • 2018-01-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多