【问题标题】:Matrix multiplication in java for large size 2 dimensional matrixjava中用于大型二维矩阵的矩阵乘法
【发布时间】:2012-03-02 16:06:18
【问题描述】:

我目前正在做关于声音处理的项目,在这个项目中,它需要乘以包含声音数据的矩阵,即幅度,我必须处理矩阵,主要执行乘法,但矩阵中的元素数量太多......它接近 600kb .wav 文件中的大约 120000 个元素。

所以当我执行乘法时,它给了我一个例外......

线程“主”java.lang.OutOfMemoryError 中的异常:Java 堆空间

请给我一个解决方案...

【问题讨论】:

  • 你能把它分解成更小的矩阵吗?在这样大小的矩阵上运行矩阵数学会导致性能非常差(即使你在内存限制内得到它)
  • 您是否需要将整个矩阵保存在内存中?难道你不能只乘以块,从文件中读取并将结果输出到另一个文件吗?
  • 如果元素是 long 或 double,它们每个是 8 个字节。 120000 *8 = 960 000 字节 ~= 1 兆字节。那不是很多内存。您可以毫无困难地同时记住其中的几个。还是您的意思是您的矩阵有 120 000 行和 120 000 列?
  • 你要乘多少个矩阵?那些 square 矩阵?程序在哪里运行?请告诉我们更多细节。

标签: java audio matrix


【解决方案1】:

听起来你做错了什么。使用比原始数据文件更多的内存是很常见的,但很少需要超过 10 倍(只想到压缩的想象)

我建议您使用 VisualVM 来了解为什么要使用这么多内存。只要查看触发错误的方法(即查看堆栈跟踪),您可能会发现问题

假设您要使用 120,000 float 作为振幅,即 480 KB 可以在大多数手机上解决。 BTW:你是在手机上做的吗?

【讨论】:

    【解决方案2】:

    有两种可能:

    1. 您无意中尝试创建一个大矩阵。例如,矩阵乘法不是可交换的,A*B 的大小可能与B*A 的大小非常不同。异常的位置应该提供一个强有力的线索,让您可以在代码中查找错误的位置。
    2. 您的算法确实需要创建一个巨大的矩阵。有几种方法可以尝试解决这个问题:
      • 为 JVM 提供更多 RAM;
      • 不要一次将整个巨大的矩阵存储在内存中,而是更改代码以便在任何给定时间只存储其中的一部分;
      • 尝试利用矩阵的结构(例如稀疏性)。

    【讨论】: