【问题标题】:Large matrixes in Java [duplicate]Java中的大型矩阵[重复]
【发布时间】:2018-11-26 22:41:00
【问题描述】:

我有一个大矩阵(大约 100x20.000.000)整数元素。我将其存储为列表的 ArrayList。不幸的是,Java 不喜欢这样,我得到了 OutOfMemoryError。

有没有在 Java 中存储大矩阵的好方法?

我习惯了pythons“导入库为你做这件事”。 java中是否有合适的库?

This post 不是我的问题的解决方案,因为在那篇文章中,用户试图存储字符串。解决方案是将字符串映射到整数,从而节省一些空间。我不能这样做。我只有一个大整数矩阵。

【问题讨论】:

  • 您是否使用了该矩阵的所有值?如果是,您至少需要 4x50M=200MB 的 RAM 来存储原始矩阵数据。不是那么多。我认为只需设置 java 运行时参数,例如-Xmx2040m 应该修复 OutOfMemoryError
  • @zolv 谢谢你,我会试试的。
  • @csmckelvey 那么该帖子的建议是只使用数组而不是列表?我认为哈希映射对我来说是不可行的,因为它对范围没有限制,这意味着内容可以是任何随机整数
  • int 使用 4 个字节,但 Integer 和引用每个使用大约 32 个字节。如果您遇到内存问题,请使用 int[] 而不是 List<Integer>
  • 完整性检查:你有多少内存?在没有开销和压缩的情况下,存储这些数据本身会消耗 8 GB 的存储空间,而这是在您尝试对其进行任何实际操作之前。

标签: java python matrix out-of-memory


【解决方案1】:

我只有一个大整数矩阵。

所以使用int的大矩阵

int[][] ints = new int[100][500_000]; // uses about 200 MB each.

如果你有List<List<Integer>>,每个人将使用大约 8 倍。

我使用-Xmx300m 运行以下命令,这是您使用的堆大小的 1/7。

public static void main(String... args) {
    int[][] ints = new int[100][500_000];
    for (int[] arr : ints) {
        Arrays.fill(arr, 1);
    }
}

这运行没有错误。


如果矩阵非常稀疏,使用Maps 会有所帮助。我建议使用这样的包装类。

import java.util.HashMap;
import java.util.Map;

public class SparseMatrix<T> {
    final Map<Integer, T>[] maps;
    final int rows, columns;

    public SparseMatrix(int rows, int columns) {
        maps = new Map[rows];
        for (int i = 0; i < rows; i++)
            maps[i] = new HashMap<>();
        this.rows = rows;
        this.columns = columns;
    }

    public int getRows() {
        return rows;
    }

    public int getColumns() {
        return columns;
    }

    public T get(int r, int c) {
        return maps[r].get(c);
    }

    public void set(int r, int c, T t) {
        maps[r].put(c, t);
    }
}

对于更完整的功能库,谷歌建议使用https://java-matrix.org/,它对 Java 中的许多矩阵库进行了比较。

【讨论】:

  • 对不起,我错了。我不是 500k,而是每行大约 20.000.000...
  • @User12547645 矩阵一定很稀疏,实际设置了多少百分比的值?
  • 不是很多。 java中有稀疏数组的良好实现吗?也许不是安卓,而是“原生”解决方案?
  • 哦,对不起,我读到“不是很多”值实际上是在数组中设置的 :)
  • @PeterLawrey 一点也不难,但在 Java 中访问它的语法很糟糕,我做过一次。我喜欢java,但纯数学不是它的强项'特别是当我开始尝试实现可以​​使用不同(整数,浮点)实现的抽象矩阵时。问题的很大一部分是数字的基类中没有任何操作。 Groovy 只是对 Java 语法进行了修饰,以便让那些想要强调数学表达而不是代码的人看起来更像数学。
猜你喜欢
  • 2013-04-12
  • 1970-01-01
  • 2012-01-30
  • 1970-01-01
  • 2021-10-26
  • 2013-03-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多