【问题标题】:Boost Graph Library - Graph with exactly N Edges/VertexBoost Graph Library - 恰好有 N 条边/顶点的图
【发布时间】:2017-05-07 08:44:24
【问题描述】:

我正在使用 BGL 邻接表来描绘一个非常规则的图,我确切地知道每个顶点都有 N 条边。

这是我的图表定义:

typedef boost::vecS OutEdgeList;
typedef boost::vecS VertexList;
typedef boost::no_property GraphProperties;
typedef boost::vecS EdgeList;

// Graph definition
typedef boost::adjacency_list<
            OutEdgeList,
            VertexList,
            boost::undirectedS,
            VertexProperties,
            EdgeProperties,
            GraphProperties,
            EdgeList
            > Graph;
Graph g;

我使用向量/vecS 来存储连接,我想通过天真地调用 boost::add_edge 列表将在需要向量的情况下调整大小,大约是上次大小的两倍。

该图使用大量 RAM(~12GiB),当假设 N=9 为 16 个连接保留时,我不希望该向量。

有没有一种内存有效的方式来预初始化邻接列表容器,比如

for(auto edgesOfVert:edgesOfVerts)
    edgesOfVert.reserve(N);

或者其他方式利用图形的规律性来节省内存?

感谢您的建议!

已编辑:作为一种可能的解决方案,我发现了 this,但我同意 sehe 并考虑保留适量的边缘不优雅,因为它试图强制使用不是为我需要的特定任务而制作的数据结构对于

【问题讨论】:

  • 我至少找到了一种使用g.m_edges.reserve(N*num_verts); 调整边缘列表大小的方法,我正在进一步阅读 BGL 文档。有没有办法遍历 OutEdgeList 以对图的“内部”邻接列表做同样的事情?
  • 恕我直言,将如此大小的整个图形加载到内存中不太可能是要走的路。简单地访问每个边缘将花费太长时间。我建议您考虑一下您的问题并找到一种方法来组织磁盘上的数据,这样您只需要在需要时加载实际需要的部分。

标签: c++ vector boost boost-graph


【解决方案1】:

这里真正的解决方案是不使用boost::adjacency_list。相反,请调整您自己的数据结构以对您需要的 Graph 概念进行建模。

例如,Boost Graph Library 中有 grid_graph&lt;&gt; 模型(如果我没记错的话)根本不使用顶点存储,并且确实提前知道所有节点之间将存在多少条边.

您仍然可以使用适用于建模的图概念的所有图算法(grid_graph&lt;&gt; 模型 Incidence GraphAdjacency GraphVertex List GraphEdge List GraphBidirectional GraphAdjacency Matrix)。

还可以考虑对图形内存进行映射,这样您就不必完全“加载”它,甚至不必在任何给定时间将其放入 RAM(不过要注意访问时间,这完全取决于访问模式以及如何布局数据)。

【讨论】:

  • 实现我自己的数据结构现在即将被讨论。而且我已经在玩 grid_graph 但我想将所有可能性相互比较:) 内存映射图表就像将它们序列化到硬盘?
  • "like" 但没有序列化步骤。看看 Boost Interprocess 例如我有很多关于使用它的答案。基本上,这意味着以这样一种方式处理自包含数据,即数据在内存中的位置无关紧要(这意味着它可以按需分页)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-15
  • 2012-05-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-21
  • 2016-04-07
相关资源
最近更新 更多