将大数据集加载到 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

将大 csv 文件中的小随机样本加载到 R 数据框中

将大数据从本地数据库加载到 UITableview 而无需 ui 冻结

将大数据表复制到 MS Access 表 C#

如何将大数据集分成n个子集,保持类比例

如何有效地将大文件加载到 IndexedDB 存储中?我的应用程序在超过 100,000 行时崩溃