【发布时间】: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