Java中的大型矩阵

时间:2018-11-26 22:41:01

标签: java python matrix out-of-memory

我有一个大矩阵(大约100x20.000.000)整数元素。我将其存储为列表的ArrayList。不幸的是,Java不喜欢这种方式,并且出现了OutOfMemoryError。

是否有很好的方法在Java中存储大型矩阵?

我习惯使用python“导入库为您完成此操作”。在Java中是否有适合此的库?

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

1 个答案:

答案 0 :(得分: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);
    }
}

这运行没有错误。


如果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/,它具有Java中许多矩阵库的比较。