【问题标题】:Large and Sparse Matrix Multiplcation大型稀疏矩阵乘法
【发布时间】:2013-06-09 03:47:42
【问题描述】:

我有一个大小为 180GB(text , 30k * 3M) 的非常大且稀疏的矩阵,仅包含条目而没有其他数据。我必须对其进行矩阵乘法、求逆和一些类似的线性代数运算。我尝试了倍频程和简单的单线程 C 代码进行乘法运算,但我的 40GB 系统 RAM 很快用完,然后我发现程序开始抖动。我还有其他选择吗?我不熟悉 MathLab 或任何其他可以帮助我这样做的矩阵运算库。

当我运行两个具有 10 行和 3 M 列的矩阵的简单矩阵乘法及其转置时,会出现以下错误:

    memory exhausted or requested size too large for range of Octave's index type

我不确定这是否适用于 Matlab。对于稀疏矩阵表示和矩阵乘法,是否有其他库或代码。

【问题讨论】:

  • 你是说全矩阵数据是180GB,还是说稀疏表示本身是180GB?矩阵维度是多少,有多少个非零元素?
  • 如果我做对了,您可以将整个 180GB 矩阵加载到一个 octave 变量中,那么当您尝试摆弄这个巨大的变量时就会遇到内存问题?你能把巨大的变量转换/转换成sparse,例如m=readFromFile( hugeFileName.txt );m=sparse(m);吗?
  • 您必须阻止导入矩阵,将每个导入的块转换为稀疏并将其存储到元胞数组中。导入所有块后,只需一次将它们连接起来。您会注意到,如果您的稀疏度为 99%,则 180GB 将消失。]
  • 请参阅this discussion,了解 Octave 中矩阵的大小限制(包括稀疏矩阵)。基本上归结为 Octave 在内部使用 32 位整数来索引矩阵的事实。您可以使用 64 bit indexing 构建 Octave,但所有 Octave 依赖项也都需要它。
  • MATLAB 允许稀疏索引为 2^48-1 = 281474976710655,其中 3e4 * 3e6 较小(对于 64 位操作系统)

标签: matlab matrix octave matrix-multiplication sparse-matrix


【解决方案1】:

您是否考虑过分块执行处理?转置和乘法非常适合块矩阵处理(请参阅https://en.wikipedia.org/wiki/Block_matrix),这将帮助您绕过索引的任何限制。

这不会帮助您进行矩阵求逆,除非您可以在不在对角线上的块完全为空时将矩阵分解为块,这在您的假设中没有说明。

【讨论】:

    【解决方案2】:

    如果非零条目足够少,我建议创建一个具有适当维度和最大非零条目的稀疏矩阵 S;见matlab create sparse matrix。然后正如@oleg komarov 所描述的,将矩阵加载到块中,并将每个块中的非零条目分配到稀疏矩阵 S 中的正确地址中。我觉得如果你的矩阵足够稀疏,那么加载它确实是你面临的唯一困难.我与大型转运运营商有类似的问题。

    【讨论】:

    • 如果矩阵是稀疏的,这确实是一个选项,您也可以尝试将其转换为 logical() 并使用尽可能多的逻辑运算符(保留逻辑类型),但是如果您的矩阵真的很大,你仍然会遇到内存溢出或 32 位索引溢出(因为索引的最大数量也是有限的,即使是稀疏的!)。
    【解决方案3】:

    Octave 的内存资源限制约为 2GB,矩阵可容纳的最大索引数约为 2^32(对于 32 位 Octave)。 MatLab 没有这样的内存限制,因为它将使用您所有的内存资源,包括交换文件。因此,您可以通过设置一个巨大的交换文件来尝试使用 MatLab,然后您可以计算您的操作(但无论如何这将花费相当长的时间......)。

    如果您对其他方法感兴趣,可以查看核外计算,该方法旨在推广新方法来处理无法全部驻留在内存中的巨大数据集,而是将其存储在磁盘上并有效加载必要的位。

    对于实用方法,您可以查看 Blaze for Python(注意:仍在开发中!)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-07-21
      • 1970-01-01
      • 2012-06-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-27
      • 1970-01-01
      相关资源
      最近更新 更多