簡體   English   中英

Java:如何創建大型二維數組

[英]Java: How to Create Large 2-Dimensional Array

我正在嘗試編寫一個簡單的程序來模擬概率問題中描述的場景。 為了做到這一點,我嘗試創建並填充一個大型二維數組,但編譯器繼續說 java 堆大小不夠大,當我為 JVM 分配更多內存時,該進程吃掉了我的CPU 到了我的筆記本電腦崩潰的程度(請注意,它是帶有 i7 和 8GB 內存的超級本)。 這在Java中是不可能/推薦的嗎? 還有其他方法嗎? 請幫忙!

這是問題所在的行(具有 5^12 行和 12 列的二維數組):

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

PS我在編程方面有點初學者......提前謝謝你!

Java 中的每個int都是 4 字節大。 其中 244140625 個已經占用了 931MiB 的 RAM。 你想要這個 x 12。所以 10.91GiB。 據我所知,Java 可以處理這個問題,但是您擁有的 8 千兆字節 RAM 還不夠。

像 H2 ( http://www.h2database.com/html/main.html ) 這樣的數據庫很容易集成並且可以交換到磁盤。 或者你想出一個不需要存儲 5^12x12 值的更好的算法。

實際情況比他們說的還要糟糕。

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 個字節(壓縮)。

你的數組大小

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

所以,只有你的數組需要 10.91 GB 內存,所以用數組實現它是不可行的。 或者,您可以使用MySQLPostgreSQL等數據庫或其他為處理大量數據而構建的 DBMS 解決方案。

事實是,實際上,事實上

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

然后

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

然后

    arr[0].add(5);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM