Java 表示一个非常大的矩阵

Java 表示一个非常大的矩阵,java,Java,我正在查看这篇文章()并实现了关于映射和浮动的解决方案。但是,如果我用100K×100K矩阵中的每个条目填充映射,堆仍然会耗尽内存。有没有更好的解决方案不必求助于第三方解决方案(除了增加堆分配之外) 顺便说一下,我想用一个图来实现这一点。我处理大型图表。100k x 100k=100亿项;如果你没有足够的内存来存储它,听起来很难。是否需要同时将它加载到内存中?你能使用数据库吗?你能把所有的项目物理地放入堆中而不考虑结构吗?如果没有,那么您将需要查看磁盘分页机制或压缩机制。这两种方法都不容易有效地

我正在查看这篇文章()并实现了关于映射和浮动的解决方案。但是,如果我用100K×100K矩阵中的每个条目填充映射,堆仍然会耗尽内存。有没有更好的解决方案不必求助于第三方解决方案(除了增加堆分配之外)


顺便说一下,我想用一个图来实现这一点。我处理大型图表。

100k x 100k=100亿项;如果你没有足够的内存来存储它,听起来很难。是否需要同时将它加载到内存中?你能使用数据库吗?你能把所有的项目物理地放入堆中而不考虑结构吗?如果没有,那么您将需要查看磁盘分页机制或压缩机制。这两种方法都不容易有效地实现。如果矩阵中有大量重复的数字序列,您可以将其“格式化”,例如
5x(123,4x(456))
for
1234564564456456123456456456456456123456456456123456456456123456456456123456456456456456456
。与直接[x][y]访问相比,访问速度较慢,难度更大。cpu和内存之间的权衡。。。(还有算法!)但是你可以有一个单独的索引指向行(或列)的开头。对于密集矩阵,最节省内存的Java数据结构是2d数组。这听起来像是你想要的
float
s,所以它是
float[]a=新的float[100_000][100_000]此数据结构的大小为40 GB。这意味着你的机器最好至少有60千兆字节左右的内存。还要确保您使用的是64位Java。您可能需要修改JVM堆大小参数。如果数据大多是单个值或具有其他模式,那么稀疏矩阵数据结构是一个更有效的选择,正如其他人所说,但你问的方式暗示这是不真实的。100k x 100k=100亿项;如果你没有足够的内存来存储它,听起来很难。是否需要同时将它加载到内存中?你能使用数据库吗?你能把所有的项目物理地放入堆中而不考虑结构吗?如果没有,那么您将需要查看磁盘分页机制或压缩机制。这两种方法都不容易有效地实现。如果矩阵中有大量重复的数字序列,您可以将其“格式化”,例如
5x(123,4x(456))
for
1234564564456456123456456456456456123456456456123456456456123456456456123456456456456456456
。与直接[x][y]访问相比,访问速度较慢,难度更大。cpu和内存之间的权衡。。。(还有算法!)但是你可以有一个单独的索引指向行(或列)的开头。对于密集矩阵,最节省内存的Java数据结构是2d数组。这听起来像是你想要的
float
s,所以它是
float[]a=新的float[100_000][100_000]此数据结构的大小为40 GB。这意味着你的机器最好至少有60千兆字节左右的内存。还要确保您使用的是64位Java。您可能需要修改JVM堆大小参数。如果数据大多是单个值或具有其他模式,那么稀疏矩阵数据结构是一个更有效的选择,正如其他人所说的,但您所问的方式暗示这是不正确的。