你如何使用Java制作真正的大型布尔数组?

时间:2009-01-19 17:49:30

标签: java boolean

当我尝试使用Java创建一个非常大的布尔数组时,例如:

    boolean[] isPrime1 = new boolean[600851475144];

我可能会丢失精度错误?

太大了吗?

10 个答案:

答案 0 :(得分:16)

要存储600 十亿位,您需要一个绝对最小的地址空间为75 千兆字节!祝你好运!

更糟糕的是,Java规范没有规定boolean数组会为每个元素使用一位内存 - 它可以(and in some cases does)使用更多。

无论如何,我从Project Euler #3识别出这个号码。如果它需要那么多记忆,那你做错了......

答案 1 :(得分:4)

考虑使用BitSet

答案 2 :(得分:4)

由于你试图以错误的方式解决欧拉问题#3,这里有一个提示:你应该找到一个数字的所有主要因子,而不是所有的素数数字低于某个限制。

BTW:这个特殊的欧拉问题可以用很少的RAM来解决。

答案 3 :(得分:3)

数组索引是一个int,而不是long,所以你的“数组”太大而不适合数组。 其中一个java Collection类可能更适合。没关系 - Collection.size()也返回一个int,因此Collection也不能存储超过Integer.MAX_VALUE项。

答案 4 :(得分:2)

嗯......那将是大约70GB的布尔值。不会工作。没办法。

答案 5 :(得分:2)

您可以使用一个long数组,封装在一个可以处理数组上所有操作的类中。像你自己的BitSet实现一样。

答案 6 :(得分:2)

问题是你使用长值而不是数组大小的int值。 Java不支持比int的最大值更长的数组长度。 Java将长度视为long,因为您指定的大小超过了int的最大值但是在long中。因此,它必须将长度转换回int以创建数组。从长转换 - > int正在产生你看到的警告

答案 7 :(得分:1)

为什么不将值存储在文件中,然后搜索文件中的位置并提取正确的值。像其他人所说,这是70GB的数据。在大多数情况下,您甚至无法将其保留在内存中。如果您要将它存储到文件中,您甚至可以在使用按位运算符存储和检索数据时查看单个位,以节省存储空间。

此外,由于素数的数量随着数字的大小而减少,所以最好将质数本身按顺序存储在文件中,然后对数字进行二进制搜索以查看它是否为1素数。

答案 8 :(得分:1)

你在数组中有什么价值? 对于如此大的数字,我猜它将是一个稀疏数组,所以也许最好使用Map / List并且只是分配空间并为一个值存储一个值。或者,如果您的大多数值为1,则为0。

答案 9 :(得分:1)

Apache ActiveMQ有一个名为BitArrayBin的数据结构。这用于确定消息是否重复。消息ID是生产者ID和序列ID的组合。 每个生产者都有一个BitArrayBin来跟踪它的序列ID。一旦找到给定生成器的BitArrayBin,它就会将序列ID设置为BitArrayBin的长值。

 oldValue = bitArrayBin.setBit(sequenceId, true)
 if (oldVlaue) {
   "message is duplicated"
 }

该方法返回旧值。

如果y是长索引,则它用于导出bin索引和偏移量。

y = bin index * 64 + offset

BitArrayBin只不过是许多箱子的支架,其大小可以在构造过程中定义。每个bin包含一个long变量来存储这些位,因此它可以存储多达64个布尔值。

位掩码用于设置该位,然后获取它的值。

这个类没有太多文档。你需要通过它的源代码来了解内部。

enter image description here