4

いくつかのトピックを読みましたが、迷っています。私はこれにかなり慣れていません。巨大な疎行列を保存したいのですが、いくつかのアイデアがありますが、それらの中から選択できます。ここに私のニーズがあります:

  1. 約の隣接行列。5000 万の頂点。
  2. 1 つの頂点あたりの近隣の最大数 - 約。10000。
  3. 1 つの頂点あたりの平均隣接数 - 約。200-300。
  4. 高速行クエリ - ベクトルはこの行列で乗算されます。
  5. エッジを追加するための O(1) の複雑さ。
  6. ほとんどの場合、エッジは削除されません。
  7. v に隣接する頂点の列挙 - 可能な限り高速。
  8. 移植性 - あるコンピューターから別のコンピューターにベースを転送する方法が必要です。

だから、ここに私の考えがあります:

  1. ペア (行、列) を持つ巨大なテーブル。非常に単純ですが、頂点の列挙は少なくとも O(log N) になります。ここで、N - テーブルのサイズです。と思うくらい遅いです。また、索引付けする必要があります。すべての RDBMS は何に適していますか。
  2. 膨大な量のリスト: 頂点ごとに 1 つのリスト。非常に高速な列挙ですが、これを保存するには多くのリソースが必要ではないでしょうか? また、この場合にどの DBMS を使用すればよいかわかりません。おそらく NoSql でしょうか。
  3. 巨大なテーブル (行 | 列のセット)。上記の 2 つの組み合わせ。任意のセットをサポートする RDBMS があるかどうかはわかりません。何でも知ってますか?ここでNoSqlが役立つのではないでしょうか?
  4. 隣接リストのコレクション。どの RDBMS もそれに適しており、複雑さの面でのコストは適切ですが、1 つの頂点に対して DB への複数の要求によってそれらが殺される可能性があります。
  5. HDF5 - I/O のために遅くなると思います。
  6. Neo4j - 私の知る限り、データを二重にリンクされたリストに保存するので、実質的に№4と同じになりますよね?

より良い決定を選択または提案するのを手伝ってください。

どこかで見積もりが間違っていたら、訂正してください。

4

2 に答える 2

5

A hybrid neo4j / hbase approach may work well in which neo4j optimizes the graph processing aspects while hbase does the heavy lifting scalability wise - e.g for storing lots of extra attributes.

neo4j contains the nodes and relationships. It may well be enough scalability wise . My investigation on the web on independent non-neo4j sites claim up to several billion nodes/relationships on a single machine with couple of orders of magnitude better performance on traversal than RDBMS.

But.. in case more scalability were needed, you can bring in the hbase big iron to store non-relationship/node identifier extra attributes. Then simply add the hbase rowkey into the neo4j node info for lookup purposes when needed by application.

于 2013-03-03T00:17:43.223 に答える
3

最終的に、解決策 1 を実装しました。

私は 2 つのテーブルで PostgreSQL を使用しました。1 つは 2 つの列 (開始/終了) を持つエッジ用で、もう 1 つは頂点番号用の一意のシリアルと頂点の説明用のいくつかの列を持つ頂点用です。

pg_advisory_xact_lock に基づいて upsert を実装しました。少し遅かったですが、私には十分でした。

また、この構成から頂点を削除するのも面倒です。

乗算を高速化するために、エッジ テーブルをファイルにエクスポートしました。x64 マシンの RAM に配置することもできます。

正直なところ、データ量は思ったより少なかったです。1 つの頂点に対して 5000 万の頂点と平均 200 ~ 300 のエッジの代わりに、合計 700 万の頂点と 1 億 6000 万のエッジしかありませんでした。

于 2013-06-03T07:04:36.237 に答える