4

我已经阅读了几个主题,但我迷路了。我对此很陌生。我想存储巨大的稀疏矩阵并有几个想法,但可以在它们之间进行选择。这是我的需求:

  1. 邻接矩阵约。5000 万个顶点。
  2. 每个顶点的最大邻居数量 - 大约。10 000。
  3. 每个顶点的平均邻居数量 - 大约。200-300。
  4. 快速行查询 - 向量将乘以该矩阵。
  5. 添加边缘的 O(1) 复杂度。
  6. 很可能,边缘不会被删除。
  7. 尽可能快地枚举与 v 相邻的顶点。
  8. 可移植性——必须有一种方法可以将基地从一台计算机转移到另一台计算机。

所以,这是我的想法:

  1. 带有对(行,列)的巨大表。非常简单,但顶点的枚举至少为 O(log N),其中 N - 表的大小。正如我认为的那样,它很慢。此外,它必须被索引。每个 RDBMS 都会有什么好处。
  2. 大量列表:每个顶点一个列表。非常快的枚举,但是存储它不会占用太多资源吗?另外,我不确定在这种情况下使用哪个 DBMS:也许是一些 NoSql?
  3. 巨大的表(行 | 列集)。以上两种结合。我不确定是否有任何 RDBMS 支持任意集合。你知道任何?也许 NoSql 在这里有用?
  4. 邻接列表的集合。任何 RDBMS 都适用于此,并且在复杂性方面的成本是好的,但它们可能会被多个对 DB 的请求杀死一个顶点。
  5. HDF5 - 我认为它会因为 I/O 而变慢。
  6. Neo4j - 据我了解,它将数据存储在双链表中,所以它实际上与 №4 相同,对吗?

请帮助我选择或提供更好的决定。

如果我在某个地方的估计有误,请纠正我。

4

2 回答 2

5

混合 neo4j / hbase 方法可能会很好地工作,其中 neo4j 优化了图形处理方面,而 hbase 则明智地进行了繁重的可扩展性 - 例如用于存储大量额外属性。

neo4j 包含节点和关系。在可扩展性方面可能已经足够了。我在独立的非 neo4j 网站上对网络的调查声称,在一台机器上拥有多达数十亿个节点/关系,其遍历性能比 RDBMS 好几个数量级。

但是..如果需要更多的可扩展性,您可以引入 hbase big iron 来存储非关系/节点标识符的额外属性。然后只需将 hbase 行键添加到 neo4j 节点信息中,以便在应用程序需要时进行查找。

于 2013-03-03T00:17:43.223 回答
3

最后,我实施了第一个解决方案。

我将 PostgreSQL 与两个表一起使用:一个用于具有两列的边 - 开始/结束,另一个用于具有唯一序列的顶点用于顶点编号和一些列用于顶点描述。

我已经基于 pg_advisory_xact_lock 实现了 upsert。这有点慢,但对我来说已经足够了。

此外,从这个配置中删除顶点也很痛苦。

为了加快乘法速度,我已将边表导出到文件中。它甚至可以放在 x64 机器上的 RAM 中。

公平地说,数据量比我预期的要少。而不是 5000 万个顶点和 1 个顶点的平均 200-300 条边,总共只有 700 万个顶点和 1.6 亿条边。

于 2013-06-03T07:04:36.237 回答