Java:如何创建大型二维数组

时间:2015-10-08 00:53:30

标签: java arrays

我正在尝试编写一个简单的程序来模拟概率问题中描述的场景。为了做到这一点,我尝试创建并填充一个大的二维数组,但编译器继续说java堆大小不够大,当我为JVM分配更多内存时,进程会耗尽我的CPU到我的笔记本电脑崩溃的程度(请注意,这是一款带有i7和8GB内存的超级本)。这是不可能/推荐在Java?还有另外一种方法吗?请帮忙!

这就是问题所在的行(2维数组,包含5 ^ 12行和12列):

int[][] sequences = new int[244140625][12];

P.S。在编程方面我是一个初学者...提前谢谢你!

4 个答案:

答案 0 :(得分:4)

Java中的每个int都是4字节大。其中244140625已占用931MiB的RAM。你想要这个x 12.所以10.91GiB。据我所知,Java可以解决这个问题,但是你拥有的那8 GB内存是不够的。

像H2这样的数据库(http://www.h2database.com/html/main.html)易于集成,可以交换到磁盘。或者你提出了一个更好的算法,不需要存储5 ^ 12x12的值。

答案 1 :(得分:2)

实际上比他们说的更糟糕。

int[12](至少)4个字节用于类指针+ 4个字节用于数组长度+ 12 * 4个字节用于值= 56个字节。

外部数组每个指针使用4个字节,因此你得到244,140,​​625 *(56 + 4)= 14,648,437,500 = 13.6 Gb 的内存。

如果您使用-Xmx16g运行64位Java,它可能工作,但是当您只有8 Gb时,它将永远运行所有分页,并且假设指针只有4个字节(压缩)。

答案 2 :(得分:0)

您的数组大小

 244140625*12*4 = 11718750000 byte
 11718750000%(1024*1024*2024) = 10.91 GB

因此,只有您的阵列需要10.91 GB内存,因此使用数组实现它是不可行的。或者,您可以使用MySQLPostgreSQL等数据库或其他为处理大量数据而构建的DBMS解决方案。

答案 3 :(得分:0)

说实话

ArrayList<Integer>[] arr= (ArrayList<Integer>[])new ArrayList[n];

然后

for (int i = 0; i < n; i++) {
    arr[i] = new ArrayList<Integer>();
}

然后

    arr[0].add(5);