我有一个超过400万行的文本文件。每行给出道路链接的细节,即开始和结束节点的坐标,节点id,链接ID等。我将首先从文本文件中提取数据为两个数据结构,第一个将保持链接ID和相应的开始和结束节点ID。第二数据结构将保存节点id以及对应节点的x和y坐标。然后,我将研究这两个数据结构,以找到来自给定源和目标节点的路径。
我的C技能变得有点生疏,我想知道考虑到尺寸,存储和访问数据的最佳方法是什么。
非常感谢
答案 0 :(得分:0)
对我来说听起来不是那么多数据。我会从这样的事情开始:
struct link;
struct node {
struct link **links;
int nlinks;
/* whatever else you need to describe the node. */
};
struct link {
struct node *n1, *n2;
};
在读取文本文件时,将节点放入树或散列表或其他有效方式查找节点,每行,分配链接,查找开始和结束节点(必要时分配),增长他们的链接数组,将链接插入数组。
最坏的情况是,如果每个链接都有两个唯一的节点,那么你的开销是“链接数”*(2 * sizeof(struct node)+ 2 * sizeof(struct link *)+ sizeof(struct link))一个64位的机器应该是大约256MB的数据加上你想要存储的关于节点的任何其他信息,加上节点的查找表的开销。如果你使用内联avl树,树链接额外24字节,(64位)坐标和节点ID 24字节(如果你需要它们),你仍然需要低于半千兆字节的数据用。
如果节点ID是连续的,您可以使用更少的内存和一个数据结构,因为您可以将节点放在一个数组而不是链接中,只需保存链接另一端的节点ID在最糟糕的情况下你会降到100MB以下。