【问题标题】:The best way to store graph into the memory将图形存储到内存中的最佳方法
【发布时间】:2013-12-10 10:31:09
【问题描述】:

问题是我有 150 000+ 个节点,其中 200 000+ 个(可能会变化到 1 000 000 甚至更多)所有这些节点都被写入数据库。 现在我想创建一个普通图,它将打开对路由的访问。所以,我需要使用现有数据库中的数据来组合它。 我们的想法是构建这个巨大的图表,将其分成小块并写入 DB BLOBS 进行存储。我尝试以递归方式构建它,但在我看来,堆栈无法存储这么多数据,而且我的算法一直因分配错误而中断。所以,现在我对一种允许我构建这个图表的方式有点困惑。我正在考虑某种迭代方法,但主要问题是架构,我的意思是我将用于存储节点和弧的结构。 当我看到这个解决方案时,它应该是这样的:

struct Graph
{
    unsigned int nodesAmount;
    unsigned int arcsAmount;
    vector<Node*> NodeArr; //Some kind of container to store all existing Nodes
}

struct Node 
{
    unsigned int id;
    int dimension; //how many arcs use this node
    vector<Arcs*> ArcArr;
}

struct Arcs 
{
    unsigned int id;
    double cost;
    Node* Node_from;
    Node* Node_to;
}

我阅读了很多关于存储图形的方法的文章,但是对于如此庞大的图形并没有找到真正好的解决方案。 我会很高兴有任何想法。谢谢

【问题讨论】:

  • 深思熟虑:您可以使用(稀疏?)数组或矩阵,而不是使用链表。每个节点都有一个 id(无符号整数),矩阵可以是&lt;pseudocode&gt; matrix&lt;uint, uint, bool&gt; &lt;/pseudocode&gt;。该矩阵将表示邻接矩阵:True 表示存在从节点 x 到节点 y 的弧。
  • @ibizaman 实际上我正在考虑使用矩阵,但它似乎很大并且有很多零。这就是为什么我正在寻找另一种方式
  • 这就是稀疏矩阵出现的地方。它只存储非零值。顺便说一句,Danstahr 的回答是更好地考虑空间使用情况。

标签: c++ database graph architecture


【解决方案1】:

我知道这个解决方案与您的 sn-p 无关,但我想向您展示另一种方式。

经常使用的选项是有两个数组 - 一个用于边缘,一个用于顶点。

顶点数组指向边数组并表示相邻顶点的开始位置。边数组本身存储相邻顶点。

例如:

V = 6, E = 7

vertices = [0, 1, 1, 2, 5, 6]
edges = [1, 2, 3, 4, 5, 6, 0]

考虑到索引,边数组看起来像:

| [1] | [] | [2] | [3, 4, 5] | [6] | [0] |

所以第一个顶点有一个相邻的顶点(id 为 1),第五个顶点有 3 个相邻的顶点,id 分别为 3、4、5 等。

【讨论】:

  • 非常感谢您的回答)
【解决方案2】:

你在正确的道路上。

我建议的一些小改动:

struct Graph
{
    unsigned int nodesAmount;
    unsigned int arcsAmount;
    vector<Node> NodeArr; // Store the nodes directly, not pointers
}

struct Node 
{
    unsigned int id;
    int dimension; //how many arcs use this node
    vector<int> Neighbours; // store neighbour IDs, saves memory
}

由于您在数据库和 C 之间移动,我强烈建议不要使用指针,因为它们不会翻译。使用 ID 并按 ID 查找节点。如果您需要单独存储边缘,那么也可以通过 ID 来执行此操作,而不是通过指针。

【讨论】:

  • @Segey-l 听起来不错,但我要实现路由抛出此图,所以我需要以某种方式存储每个弧的成本。
  • @tema.krukovets 然后将其设为struct { int neighbourID; double cost;}
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-12-24
  • 2011-02-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-15
  • 1970-01-01
相关资源
最近更新 更多