您将如何处理一个数组或列表,其中包含的条目数多于标准实现允许您访问的条目

时间:2009-07-09 17:08:43

标签: java types large-data-volumes

我正在尝试创建一个理论上可以处理的数组或列表,给定足够的硬件等,多达100 ^ 100个BigInteger条目。使用数组或标准列表的问题是它们只能保存Integer.MAX_VALUE条目数。你会如何解决这个限制?一个全新的类/接口?列表的包装?完全是另一种数据类型?

7 个答案:

答案 0 :(得分:4)

100 ^ 100 = 10 ^ 200。假设BigInteger的内存占用量为28个字节(它有7个int字段),即2.8 * 10 ^ 201字节或2.8 * 10 ^ 192千兆字节。没有足够的硬件,从来没有: - )

答案 1 :(得分:4)

理论上,22维java数组有足够的空间来容纳数据。

但我们应该记住,整个宇宙中的原子数估计为10 ^ 78(ref in German)。

所以,在开始实现之前,你必须考虑如何在宇宙中的每个原子上存储10 ^ 23个字节......

修改

通常,如果需要支持O(1)中访问的大型数据结构,则可以创建多维数组。

二维数组数组[Integer.MAX_VALUE] [Integer.MAX_VALUE] 可以包含 4.6x10 ^ 18 值。您可以通过 array [ai mod Integer.MAX_VALUE] [ai div Integer.MAX_VALUE] 来处理每个值 ai 。当然,这也适用于更高维数组。

答案 2 :(得分:1)

我会创建一个允许更大值的新接口类型。可能使用long来表示最大尺寸和索引参数。

答案 3 :(得分:0)

我想到的第一件事就是创建一个支持ArrayList索引的新long类型,并且包含多个ArrayList的数组。然后,您可以实现get / set / etc方法,以便在访问大于2 ^ 32的索引时,访问数组中的下一个ArrayList。要确定要使用的数组,请将索引哈希(2^32 - 1) mod index

要处理大小限制问题,您必须将某些阵列序列化到磁盘。如果你在HPC中,这不是那么多的问题。我有权访问的shared memory system每个节点有256GB可用内存。你需要多长时间来遍历该列表是另一个问题,但我认为天体物理学家做的事情接近那个规模。

列表的大小看起来太大而无法使用(正如其他海报所说的那样),因此您必须将内容缩小到可行的大小。

答案 4 :(得分:0)

你可以使用链接列表......但是你会在list.get(list.size()-1)返回之前死掉: - )

顺便说一下,看一下可以处理大量数据的Fastutil馆藏库。

答案 5 :(得分:0)

您可以从2个32位整数中有效地获取64位int,或者从4个32位整数中获得128位int,或者实际上从足够的整数中获得任何大小。

为了演示,考虑表示具有2个32位整数的64位int的最简单情况。

一些伪代码:

int64 c = Get64BitInt(int32 a, int32 b)
{
   c = 2^32*a + b
}

您可以使用整数数组定义一个新类来保存大整数来存储数字。你必须编写自己的算术方法,但这不应该太费力。

答案 6 :(得分:0)

我认为有几个原因你正在考虑制作自己的收藏品。首先,列表接口假定为int length。虽然你可以强制列表实现在理论上不是0,从而使你的潜在容量加倍,但它仍然会有点冒险。

另一个原因是您可能正在查看未完全存储在内存中的内容,因此缓存,索引,迭代等将具有外部资源依赖性,您可能只需要按索引或迭代器获取,而不是两者都需要

这听起来像是一个庞大的分布式计算问题,而这并不是Java集合旨在解决的问题。

但是,如果您只需要这么大的索引(因为您在很长的一行上绘制了少量的点),那么由Map支持的自定义接口(包含BigInteger键和表示列表内容的值)可能得到你想要的。如果你真的想要类似List的行为,Map实现可能必须单独跟踪插入顺序。