将图形存储到内存中的最佳方法

时间:2013-11-25 15:58:00

标签: c++ database graph architecture

问题是我有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;
}

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

2 个答案:

答案 0 :(得分:6)

你走在正确的道路上。

我建议的一些小改动:

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而不是指针来完成。

答案 1 :(得分:2)

我知道此解决方案与您的代码段无关,但我想以另一种方式向您展示。

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

顶点数组指向边数组,并说明相邻顶点的起始位置。 edges数组存储相邻的顶点。

例如:

V = 6, E = 7

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

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

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

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