繁体   English   中英

如何在Java中有效访问半稀疏数据?

[英]How can I access semi-sparse data efficiently in java?

因此,我正在处理一个将大文本文件解析为数据的问题-文件的每一行都由具有多个数据字段的Node对象表示。

在程序执行期间,将根据它们的int id字段(在文本文档中指定)多次访问这些对象。

如果每个id都存在,我将简单地将它们存储为Node[]数组,并且要访问id x的节点,我将仅使用nodeArray[x]

但是,该数据使得大多数id值不存在。 对于我目前的数据集,只有约40-50%的id 0和最大的之间的idID_MAX在集合存在于集。

我看到的方式有两种选择:

使用大型Node[]和许多未填写的条目,如

Node[] nodeArray = new Node[ID_MAX];

BufferedReader br = new BufferedReader(new FileReader(file));
String line;

while((line = br.readLine()) != null) {
    Node n = ... // parse line of text into Node object
    nodeArray[n.getID()] = n;
end
br.close();

这将使访问具有特定id的节点变得微不足道,但是在数据集很大的情况下会占用大量额外空间。

另一个选择是使用较小的Node[]数组,并使用稀疏的int[]数组进行索引:

Node[] nodeArray = new Node[NUM_ROWS];
int[] indexArray = new Int[ID_MAX];

BufferedReader br = new BufferedReader(new FileReader(file));
String line;
int i = 0;

while((line = br.readLine()) != null) {
    Node n = ... // parse line of text into Node object
    nodeArray[i] = n;
    indexArray[n.id] = i;
    i++;
}

总体而言,这两者中的任何一个是否比另一个更好?还是取决于数据的大小和稀疏性? 我还有没有想到的另一种方法比这两种方法中的任何一种更好?

根据此处的描述,您可以使用HashMap<Integer, Node>HashMap<Long, Node>具体取决于您拥有的id的范围。

根据您的其他要求, LinkedHashMapTreeMap可能是替代方案(如果需要按插入顺序对节点进行迭代,则可以选择LinkedHashMap如果需要按某些条件对它们进行排序,则可以选择TreeMap )。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM