簡體   English   中英

如何在Java數組中存儲1億個整數?

[英]How to store 100 million integers in a Java array?

我正在做一個小任務,我需要在一個數組中存儲大約10億個整數。 但是,我遇到了堆空間問題。 你能幫幫我嗎?

機器詳細信息:Core 2 Duo處理器,4 GB RAM。 我甚至嘗試過-Xmx 3072m。 這有什么工作嗎? 同樣的事情在C ++中起作用,所以應該有一種方法可以將這么多數字存儲在內存中。

下面是我得到的代碼和例外:

public class test {
    private static int C[] = new int[10000*10000];

    public static void main(String[] args) {
        System.out.println(java.lang.Runtime.getRuntime().maxMemory()); 

    }

}

異常:線程“main”中的異常java.lang.OutOfMemoryError:測試時的Java堆空間。(test.java:3)

使用關聯數組。 鍵是一個整數,值是count(整數添加到列表中的次數)。

如果分布相對隨機,這應該可以為您節省一些空間,如果不是這樣的話,那就更好了。

如果你需要存儲10億個完全隨機的整數,那么我擔心你確實需要相應的空間,即32位int的內存大約為4GB。 您可以嘗試增加JVM堆空間,但是您需要擁有64位操作系統並且至少需要盡可能多的物理內存 - 而且只有到目前為止您才能使用。

另一方面,如果您可以在應用程序中使用特定約束,則可以更有效地存儲這些數字。

例如,如果您只需要知道某個集合中是否包含特定的int ,那么您可以使用一個位設置 - 即int范圍中每個值的一個位。 這大約是40億比特,即512 MB - 更合理的空間要求。 例如,少數BitSet對象可以覆蓋整個32位整數范圍,而無需編寫任何位處理代碼......

可能使用內存映射文件會有幫助嗎? 它們不是從堆中分配的。 這是一篇如何創建矩陣的文章。 數組應該更容易。

使用內存映射文件獲取巨大的矩陣 - Peter Lawrey

您可以在32位系統上增加到4GB。 如果您使用的是64位系統,則可以更高。

輸入cmd這個

java -Xmx4g programname

由於陣列太大可能無法放入RAM中,因此需要配置足夠的HDD交換空間。 交換4 - 16 Gb在這些時候看起來不像是不切實際的東西。

Java只允許使用int作為數組的索引,而不是long 因此,最大可能的數組可以具有2147483648個值,足夠。

使用-Xmx來提高默認情況下可能不足的內存上限。 30.7億是不夠的,因為10億英鎊需要大約4 Gb。 由於操作系統等也需要空間,具有4 Gb RAM的機器不能將所有4 Gb數據結構保存在存儲器中。

JRE或OS也可能拒絕一次性授予一塊如此大的內存,需要分配一些較小的塊(可能是數組或數組)。

暫無
暫無

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

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