【问题标题】:Multiplying two Huge matrices using spark使用火花将两个巨大的矩阵相乘
【发布时间】:2014-10-25 08:17:54
【问题描述】:

我目前正在学习火花。我想计算矩阵 W 并将其定义为 W=B*H'*inverse(R + H*B*H')这里每个变量都是一个矩阵和

  1. B=eb*eb'(eb'表示eb向量的转置)[400000 * 400000]
  2. R=eo*eo'(eo'表示eb向量的转置)[200000 * 200000]
  3. H是稀疏矩阵[200000 * 400000]

并且 eb 矩阵大小是 4000000*1 所以我的 B 矩阵大小是 400000*400000 现在问题是存储这个总文件我目前使用 4GB RAM、500GB 磁盘空间计算机。最初我在matlab中通过块乘法完成了这个,我正在将输出写入文件,我的输出文件大小超过300GB。并且在我使用 spark 完成之后花费了很多时间,它花费的时间更少,但输出文件的大小相同。

我已经用matrix multiplication这个方法将两个向量相乘

在计算 B 矩阵后,我无法计算 B*H',因为它需要将它们存储在 RAM 中以将这两个矩阵相乘。当我在上面运行代码时,它给出了内存异常。有没有办法用有限的内存来做这个计算,我的意思是不把总数带入内存。以及如何计算大小为 [200000 * 200000] 的巨大矩阵的逆矩阵。

【问题讨论】:

  • 如果您的目标是学习 Spark,请不要学习如何计算大矩阵的逆。有大量关于算法和技术的文献,无论是理论的还是应用的,用于避免反转大矩阵。最好建议您了解矩阵求逆的替代方法。数学家不关心实际问题,把他们的反演抛在脑后,让可怜的计算学家去实际求解没有反演的方程组,这在计算上是非常昂贵的。
  • 谢谢,虽然我可以避免求逆但我无法避免矩阵乘法,实际上我必须在matlab中这样做但是数据太大所以我的导师建议我学习spark,所以我我正在学习火花,特别是对于这种乘法。
  • 也不需要计算 400,000×400,000 B。尝试更改执行乘法的顺序。例如,H*eb 是 200,000×1。这个结果的转置等于eb'*H'。当然,200,000 x 200,000 仍然很大。这些矩阵是对称的,可以逐个元素或逐行计算,结果存储在文件中。
  • 我已经做到了,之后我应用了相同的乘法方法它的输出文件也超过了100GB,但问题又来了

标签: matlab scala matrix apache-spark matrix-inverse


【解决方案1】:

如果矩阵的几乎所有条目都是 0,您可能需要考虑使用稀疏矩阵数据结构,仅存储主对角线和位置映射到非零条目。

【讨论】:

  • 没有,除了 H,所有矩阵都有超过 75% 的非零值
猜你喜欢
  • 1970-01-01
  • 2021-04-24
  • 1970-01-01
  • 1970-01-01
  • 2015-04-01
  • 1970-01-01
  • 2018-01-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多