用于大规模持久化图形的 NoSQL 解决方案

2024-02-26

我迷上了使用 Python 和 NetworkX 来分析图表,随着我了解的越来越多,我想使用越来越多的数据(我猜我正在成为一个数据迷:-)。最终我认为我的 NetworkX 图(存储为字典的字典)将超出我系统上的内存。我知道我可能可以添加更多内存,但我想知道是否有办法将 NetworkX 与 Hbase 或类似的解决方案集成?

我环顾四周,并没有真正找到任何东西,但我也找不到与允许简单 MySQL 后端相关的任何东西。

这可能吗?是否存在允许连接到某种持久存储的东西?

Update

我记得在“初创公司的社交网络分析”中看到过这个主题,作者讨论了其他存储方法(包括 hbase、s3 等),但没有展示如何做到这一点或是否可能。


用于存储图形的容器一般有两种类型:

  1. 真实的图数据库: e.g., Neo4J, 阿伽门农, GraphDB, and 快板;这些不仅存储图形,而且还了解图形,因此,例如,您可以查询这些 数据库例如,之间的最短路径有多少个节点 节点 X 和节点 Y?

  2. 静态图容器:Twitter 的 MySQL 适配的 FlockDB 是这里最著名的范例。这些数据库可以存储和检索 图表就好了;但要查询图表本身,您必须首先 从数据库中检索图形,然后使用库(例如,Python 的 优秀的 Networkx)来查询图本身。

我下面讨论的基于 redis 的图形容器属于第二类,尽管显然 redis 也非常适合第一类容器,如下所示redis-graph http://pypi.python.org/pypi/redis_graph/1.0,一个非常小的 python 包,用于在 redis 中实现图形数据库。

redis在这里会工作得很好。

Redis http://www.redis.io是一个适合生产使用的重型、耐用的数据存储,但它也足够简单,可以用于命令行分析。

Redis与其他数据库不同的是,它有多种数据结构类型;我在这里推荐的是hash数据类型。使用此 Redis 数据结构可以让您非常接近地模仿“字典列表”,这是一种用于存储图形的传统模式,其中列表中的每个项目都是一个边字典,键控到这些边所源自的节点。

您需要先安装redis http://www.redis.io和Python客户端。这DeGizmo 博客 http://degizmo.com/2010/03/22/getting-started-redis-and-python/有一个出色的“启动和运行”教程,其中包括一步步两者安装指南。

一旦安装了 redis 及其 python 客户端,启动一个redis服务器,你确实喜欢这样:

  • cd到您安装 redis 的目录(/usr/local/bin如果您通过以下方式安装,则在 'nix 上进行安装); next

  • type redis服务器在 shell 提示符下输入

您现在应该在 shell 窗口中看到服务器日志文件

>>> import numpy as NP
>>> import networkx as NX

>>> # start a redis client & connect to the server:
>>> from redis import StrictRedis as redis
>>> r1 = redis(db=1, host="localhost", port=6379)

在下面的代码片段中,我存储了一个四节点图;下面的每一行都调用hmset在redis客户端上并存储一个节点和连接到该节点的边(“0”=>无边,“1”=>边)。 (当然,在实践中,您可以在函数中抽象这些重复调用;这里我显示每个调用,因为这样可能更容易理解。)

>>> r1.hmset("n1", {"n1": 0, "n2": 1, "n3": 1, "n4": 1})
      True

>>> r1.hmset("n2", {"n1": 1, "n2": 0, "n3": 0, "n4": 1})
      True

>>> r1.hmset("n3", {"n1": 1, "n2": 0, "n3": 0, "n4": 1})
      True

>>> r1.hmset("n4", {"n1": 0, "n2": 1, "n3": 1, "n4": 1})
      True

>>> # retrieve the edges for a given node:
>>> r1.hgetall("n2")
      {'n1': '1', 'n2': '0', 'n3': '0', 'n4': '1'}

现在该图已被持久化,可以从 Redis DB 中将其作为 NetworkX 图检索。

有很多方法可以做到这一点,下面是这样做的two*脚步*:

  1. 将redis数据库中的数据提取到邻接矩阵, 作为 2D NumPy 数组实现;然后

  2. 使用 NetworkX 将其直接转换为 NetworkX 图built-in功能:

简化为代码,这两步是:

>>> AM = NP.array([map(int, r1.hgetall(node).values()) for node in r1.keys("*")])
>>> # now convert this adjacency matrix back to a networkx graph:
>>> G = NX.from_numpy_matrix(am)

>>> # verify that G in fact holds the original graph:
>>> type(G)
      <class 'networkx.classes.graph.Graph'>
>>> G.nodes()
      [0, 1, 2, 3]
>>> G.edges()
      [(0, 1), (0, 2), (0, 3), (1, 3), (2, 3), (3, 3)]

当您结束 redis 会话时,您可以从客户端关闭服务器,如下所示:

>>> r1.shutdown()

redis 在关闭之前将数据保存到磁盘,因此这是确保所有写入都被持久化的好方法。

那么redis数据库在哪里呢?它以默认文件名存储在默认位置,即dump.rdb在您的主目录中。

要更改此设置,请编辑redis.conf文件(包含在 redis 源代码发行版中);转到以以下内容开头的行:

# The filename where to dump the DB
dbfilename dump.rdb

将 dump.rdb 更改为您想要的任何内容,但保留 .rdb 扩展名。

接下来,要更改文件路径,请在 redis.conf 中找到以下行:

# Note that you must specify a directory here, not a file name

下面的行是 redis 数据库的目录位置。对其进行编辑,使其列出您想要的位置。保存您的修订并重命名该文件,但保留 .conf 扩展名。您可以将此配置文件存储在您希望的任何位置,只需在启动 Redis 服务器时在同一行中提供此自定义配置文件的完整路径和名称:

因此,下次启动 Redis 服务器时,必须像这样执行(从 shell 提示符处:

$> cd /usr/local/bin    # or the directory in which you installed redis 

$> redis-server /path/to/redis.conf

最后,Python 包索引 http://pypi.python.org/pypi/redis_graph/1.0列出了专门用于在 Redis 中实现图数据库的包。该包称为redis-graph http://amix.dk/blog/post/19592#redis-graph-Graph-database-for-Python而且我还没用过。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

用于大规模持久化图形的 NoSQL 解决方案 的相关文章

随机推荐