我正在开发一个项目,涉及在大图上进行随机行走(太大而无法放入内存)。我使用 networkx 在 Python 中对其进行了编码,但很快,该图变得太大而无法容纳在内存中,因此我意识到我需要切换到分布式系统。所以,我明白以下几点:
首先,是否有足够的API让我继续用Python编写代码,或者我应该切换到Java?
其次,我找不到关于如何编写自定义遍历函数(在 Giraph 或 graphx 中)以实现随机游走算法的确切文档。
我的理解是,您需要处理存储在文件系统上的大型图形。有各种分布式图处理框架,如 Pregel、Pregel+、GraphX、GPS(Stanford)、Mizan、PowerGraph 等。
这些框架值得一看。我建议使用 openMPI 之类的 C、C++ 编码,这有助于实现更高的效率。
Java 中的框架的内存效率不是很高。我不确定 Python 中这些框架的 API。
在决定实施这些框架之前,值得一看博客和论文,它们对这些框架进行了比较分析。
为什么不在磁盘上存储边列表,然后只调用随机游走中下一个要访问的边?如果您使用树来索引节点,则可以非常节省时间。 SQL 数据库、parquet 文件或 hdf5 等解决方案为您实现索引。然而,这些解决方案的时间效率不如内存中的哈希表,但您已经放弃了这些解决方案。
networkx 的挑战正如您所描述的那样,您将图表存储在内存中。您可以为networkx配置不同的后端,但它们似乎主要添加图形算法而不是内存映射功能。