我有一个大矩阵(大约100x20.000.000)整数元素。我将其存储为列表的ArrayList。不幸的是,Java不喜欢这种方式,并且出现了OutOfMemoryError。
是否有很好的方法在Java中存储大型矩阵?
我习惯使用python“导入库为您完成此操作”。在Java中是否有适合此的库?
This post不能解决我的问题,因为在那篇文章中,用户尝试存储字符串。解决方案是将字符串映射为整数,从而节省一些空间。我不能这样做。我只有一个很大的整数矩阵。
答案 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中许多矩阵库的比较。