将大数据集加载到 Java 中的 ArrayList(ArrayList 的最大容量)
Posted
技术标签:
【中文标题】将大数据集加载到 Java 中的 ArrayList(ArrayList 的最大容量)【英文标题】:Loading big data sets to ArrayList in Java (max capacity of ArrayList) 【发布时间】:2014-01-27 12:57:24 【问题描述】:我正在尝试加载超过 2^32 个元素的数据集,并将这些元素放入 ArrayList anArrayList
。这些数据是按时间顺序排列的,所以我使用ArrayList来存储数据以保持顺序。同时,我想快速访问字符串elementID
中的元素。现在我使用 HashMap 将elementID
映射到anArrayList
中的元素对象。
我使用整数 currentAddingAt
来跟踪 anArrayList 上的索引以添加元素。下面是相关代码:
ArrayList<ElementX> anArrayList;
int currentAddingAt;
HashMap<String, ElementX> elementToObjHashMap;
... ...
public void addAnElement(ElementX e)
anArrayList.add(currentAddingAt, e);
elementToObjHashMap.put(e.getElementID, ArrayList.get(currentAddingAt));
当我将currentAddingAt
的类型从int
更改为long
时出现问题。因为 ArrayList 的get(int index)
方法只接受int
作为参数,根据Oracle 的文档(http://docs.oracle.com/javase/7/docs/api/java/util/ArrayList.html)。这也让我疑惑:
ArrayList 的容量能否大于 Java 中最大的 int 数(2^32)?
在这种情况下,除了使用 ArrayList 和 HashMap 之外,还有哪些选择(以保持大型数据集的顺序,并且仍然能够从键快速映射到对象)?除了普通的 Java,我还需要一些库(甚至是一些框架)吗?
【问题讨论】:
您可以切换到 LinkedList 实现来克服 ArrayList 的 Integer.MAX_VALUE 大小问题,但可能有更好的方法,而不是将整个数据加载到内存中。 这个链接可能会给你一些想法 - Link 对我可以使用的其他策略有什么建议吗?这些数据的使用方式是:这些元素中的大部分信息都被读取和写入,以实时动态计算信息。某种数据库会提供快速获取和修改元素中数据的速度吗?谢谢。 【参考方案1】:ArrayList的容量能否大于Java中最大的int数(2^32)?
没有。因为它是数组支持的,所以它不能大于 2^31-1。如果您希望 size()
和 toArray()
方法起作用,这适用于所有 Collections
。
您需要存储列表列表,但我敢打赌,有一个库可以做到这一点。我没有使用它的那部分,但是Fastutil has big data structures 除了它的原始数据结构。
【讨论】:
以上是关于将大数据集加载到 Java 中的 ArrayList(ArrayList 的最大容量)的主要内容,如果未能解决你的问题,请参考以下文章
将大数据集读取到Jupyter Notebook和Manipulate