我正在尝试编写一个简单的程序来模拟概率问题中描述的场景。为了做到这一点,我尝试创建并填充一个大的二维数组,但编译器继续说java堆大小不够大,当我为JVM分配更多内存时,进程会耗尽我的CPU到我的笔记本电脑崩溃的程度(请注意,这是一款带有i7和8GB内存的超级本)。这是不可能/推荐在Java?还有另外一种方法吗?请帮忙!
这就是问题所在的行(2维数组,包含5 ^ 12行和12列):
int[][] sequences = new int[244140625][12];
P.S。在编程方面我是一个初学者...提前谢谢你!
答案 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内存,因此使用数组实现它是不可行的。或者,您可以使用MySQL,PostgreSQL等数据库或其他为处理大量数据而构建的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);