代码之家  ›  专栏  ›  技术社区  ›  User12547645

Java中的大型矩阵[重复]

  •  0
  • User12547645  · 技术社区  · 7 年前

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

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

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

    1 回复  |  直到 7 年前
        1
  •  1
  •   Peter Lawrey    7 年前

    我有一个很大的整数矩阵。

    因此,使用一个大的矩阵 int

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

    如果你有 List<List<Integer>> 每个都将使用大约8倍的容量。

    我运行了以下命令 -Xmx300m

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


    如果martix非常稀疏,请使用 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/