[英]How do you make REALLY large boolean arrays using Java?
當我嘗試使用Java創建一個非常大的布爾數組時,例如:
boolean[] isPrime1 = new boolean[600851475144];
我可能會丟失精度錯誤?
太大了嗎?
要存儲6000 億位,您需要一個75 千兆字節的絕對最小地址空間! 祝你好運!
更糟糕的是,Java規范並未指定boolean
數組將為每個元素使用單個內存位 - 它可能( 在某些情況下 )使用更多。
無論如何,我從Project Euler#3中識別出這個數字。 如果它需要那么多記憶,那你做錯了......
考慮使用BitSet 。
由於你試圖以錯誤的方式解決歐拉問題#3,這里有一個提示:你應該找到一個數字的所有素因子 ,而不是所有低於某個限制的素數 。
順便說一句:這個特殊的歐拉問題可以用很少量的RAM來解決。
數組索引是一個int,而不是long,所以你的“數組”太大而不適合數組。
其中一個java Collection類可能更適合。
沒關系 - Collection.size()也返回一個int,因此Collection也不能存儲超過Integer.MAX_VALUE
項目。
嗯......那將是大約70GB的布爾值。 不會工作。 沒門。
您可以使用一個long數組,封裝在一個可以處理數組上所有操作的類中。 像你自己的BitSet實現。
問題是你使用長值而不是數組大小的int值。 Java不支持比int的最大值更長的數組長度。 Java將長度視為long,因為您指定的大小超過了int的最大值但是在long中。 因此,它必須將長度轉換回int以創建數組。 從long - > int的轉換產生了你所看到的警告
Apache ActiveMQ有一個名為BitArrayBin的數據結構。 這用於確定消息是否重復。 消息ID是生產者ID和序列ID的組合。 每個生產者都有一個BitArrayBin來跟蹤它的序列ID。 一旦找到給定生成器的BitArrayBin,它就會將序列ID設置為BitArrayBin的long值。
oldValue = bitArrayBin.setBit(sequenceId, true)
if (oldVlaue) {
"message is duplicated"
}
該方法返回舊值。
如果y是長索引,則它用於導出bin索引和偏移量。
y = bin index * 64 + offset
BitArrayBin只不過是許多箱子的支架,其大小可以在構造過程中定義。 每個bin包含一個long變量來存儲這些位,因此它可以存儲多達64個布爾值。
位屏蔽用於設置位,然后獲取它的值。
這個類沒有太多文檔。 您需要通過其源代碼來了解內部。
為什么不將值存儲在文件中,然后查找文件中的位置並提取正確的值。 像其他人所說,這是70GB的數據。 在大多數情況下,您甚至無法將其保留在內存中。 如果您要將其存儲到文件中,您甚至可以在使用按位運算符存儲和檢索數據時查看單個位以節省存儲空間。
此外,由於質數的數量隨着數字的大小而減少,所以最好將質數本身按順序存儲在文件中,然后對數字進行二進制搜索以查看它是否是素數之一。
你在數組中有什么價值? 對於如此大的數字,我猜它將是一個稀疏數組,所以也許最好使用Map / List並且只是分配空間並為一個值存儲一個值。 如果您的大多數值為1,則為0。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.