ネットワークを介した効率的なDAG比較


11

分散バージョン管理システム(例えばMercurialのGitの)効率的に有向非巡回グラフ(DAGの)を比較する必要があります。私はMercurialの開発者であり、2つのDAGを比較することの時間とネットワークの複雑さを議論する理論的な研究について非常に興味があります。

問題のDAGは、記録されたリビジョンによって形成されます。リビジョンは、ハッシュ値によって一意に識別されます。各リビジョンは、前のリビジョンのゼロ(初期コミット)、1(通常のコミット)、またはそれ以上(マージコミット)に依存します。ここではリビジョンが一例であるaためにe、各次々に行われましたが。

a --- b --- c --- d --- e

グラフの比較は、誰かが履歴の一部しか持っておらず、欠落している部分を取得したいときに表示されます。私が持っていたと想像aするcと作られたxyに基づいてc

a --- b --- c --- x --- y

Mercurialのでは、私はどうなるhg pullとダウンロードde

a --- b --- c --- x --- y
              \
                d --- e

目標は、グラフに多くの(たとえば、100,000を超える)ノードがある場合を識別しde効率的にすることです。効率は両方に関係します

  • ネットワークの複雑さ:転送されたバイト数と必要なネットワーク往復回数
  • 時間の複雑さ:変更セットを交換する2つのサーバーによって行われる計算の量

典型的なグラフは狭く、上記のような平行なトラックはほとんどありません。また、通常ey上記のような少数のリーフノード(Mercurialではヘッドと呼びます)のみが存在します。最後に、中央サーバーを使用すると、クライアントにはサーバー上にないいくつかの変更セットが含まれることがありますが、サーバーは、クライアントが最後にサーバーから最後にプルした人​​に応じて、クライアント用に100以上の新しい変更セットを持つことができます。非対称溶液が好ましい:中央サーバは、クライアントに比べて少し計算を行う必要があります。


Google Plusでの議論は少し続きました。
マーティンガイスラー

回答:


13

このコンテキストでは、グラフノードにはある種の一意の識別子(ハッシュまたはチェックサム)がありますか?したがって、サブグラフの同型テストを行う必要はありません。2つのバージョン間で異なるノードのリストが必要なだけで、このステップではエッジはまったく役に立ちません。SIGCOMM 2011論文「違いは何ですか?事前のコンテキストなしでの効率的なセット調整「(Goodrich、Uyeda、およびVargheseと)この問題を正確に考慮します。比例する通信量を使用して、2つの通信サーバーの両方ではなく1つが保持するノードのIDを判別できることがわかります。変更されたノードの数に応じて、1回のラウンドトリップのみを使用します。その情報を取得したら、最適な通信を使用して、2回目のラウンドトリップで変更自体を簡単に取得できます。


これは面白いですね!チェンジセットIDの直接比較(はい、ハッシュ値です)が機能するのは正しいことです。私たちは常にグラフ構造も使用しようとしています。両方がXを知っていれば、Xのすべての祖先を知っていることもわかります。それは重要な情報のように思えますが、そうではないかもしれません。ポインタをありがとう、あなたの論文を読みましょう!
マーティンガイスラー

@David:精度(私は現在Mercurialで使用されているアルゴリズムの作成者の1人です)。実際には、「共通」ノードのセットが重要であり、欠落しているノードの値を知る必要はありません。
-tonfa

1
何が違うのか知っているなら、何が共通しているのかも知っています。それはあなたが持っているコピーのすべてであり、違いの一部ではありません。ただし、通常、共通部分が大きい場合でも、差異は比較的小さいはずです。そのため、差異に比例する量のデータのみを通信する方が、履歴DAG全体または共通部分を通信するよりも優れています。
デビッドエップシュタイン

@David:祖先の関係のため、実際には共通領域のヘッド(リーフノード)を計算します。巨大な共有履歴があったとしても、それはまだ少量のデータです。
マーティンガイスラー

回答を更新して、使用した往復の数も含めました(非常に少ないことが判明しました)。
デビッドエップシュタイン

3

Mercurialに実装したソリューションでは、非対称性がもう1つの懸念でした。クライアントの負荷を犠牲にして、送信帯域幅とCPU時間の両方についてサーバーの負荷を最小化する必要があります。


1
おかげで、私はこれに注意するために質問を少し更新しました。
マーティンガイスラー

0

私には2段階のプロセスのように聞こえます。

  1. 親がcであるコミットがあるかどうかすべてのクライアントに尋ねる
  2. もしそうなら、cのすべての子を見つける

1.のタスクは主にクライアント側で処理され、すべてのクライアントがネット上でコミットハッシュを必要とすると思います。


どのようなシナリオを説明していますか?私が作った場合xyし、引っ張っする必要性ed、サーバーから?最初の問題は、(クライアントとして)私が「分岐点」を知らないことcです。
マーティンガイスラー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.