【发布时间】: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
-
对我可以使用的其他策略有什么建议吗?这些数据的使用方式是:这些元素中的大部分信息都被读取和写入,以实时动态计算信息。某种数据库会提供快速获取和修改元素中数据的速度吗?谢谢。
标签: java arraylist biginteger large-data bigdata