[英]How can I access semi-sparse data efficiently in java?
因此,我正在处理一个将大文本文件解析为数据的问题-文件的每一行都由具有多个数据字段的Node
对象表示。
在程序执行期间,将根据它们的int id
字段(在文本文档中指定)多次访问这些对象。
如果每个id
都存在,我将简单地将它们存储为Node[]
数组,并且要访问id
x的节点,我将仅使用nodeArray[x]
。
但是,该数据使得大多数id
值不存在。 对于我目前的数据集,只有约40-50%的id
0和最大的之间的id
, ID_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的范围。
根据您的其他要求, LinkedHashMap
和TreeMap
可能是替代方案(如果需要按插入顺序对节点进行迭代,则可以选择LinkedHashMap
如果需要按某些条件对它们进行排序,则可以选择TreeMap
)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.