【问题标题】:Using boost's memory mapped files to store graph data使用 boost 的内存映射文件来存储图形数据
【发布时间】:2024-05-02 20:05:05
【问题描述】:

我有一个包含大约 100,000 个节点和 2 亿条边的无向图。每条边都有少量与之相关的数据(5 个整数)。在我的应用程序的先前版本中,图形要小得多,将所有边简单地存储在纯文本文件中并完整读取该文件不是问题。使用我的新的更大的图表,这很快就会导致内存问题,因为边缘文件本身有几 GB。

我的图形应用程序非常简单:我只需选择一个节点并迭代它的边,直到目标节点满足某些条件。然后我迭代这个目标节点的边,重复这个过程,直到创建一个由少量边(个位数)组成的网络。

由于我一次只使用该图表的一小部分,它似乎是内存映射文件的一个很好的应用程序。但是,我不确定这将如何实现。我怎样才能只访问我感兴趣的边块(即连接到指定节点的边)?我希望使用 boost 的内存映射文件实现,但非常感谢任何指导。

【问题讨论】:

    标签: c++ boost memory-mapped-files


    【解决方案1】:

    我认为在 C++ 中从头开始这样做很困难。即使在 Boost 的帮助下。因为内存在目标平台上是有限的。所以你必须非常仔细地设计你的数据结构。不过我建议你可以尝试使用像 neo4j 这样的图形数据库或像 PostGIS 这样的空间数据库。它已经在文件系统上实现了 Graph 数据结构。

    【讨论】:

    • 我没有看到问题中隐含的空间信息?空间索引是否可以通过某种方式普遍适用于图算法?
    • 空间索引可用于解析图算法。因为网络数据结构在 PostGIS 等空间数据库中得到了很好的实现。