네트워크를 통한 효율적인 DAG 비교


11

에서는 분산 버전 관리 시스템 (예 의욕힘내 ) 효율적 관한 비교할 비순환 그래프 (DAG에) 할 필요가있다. 저는 Mercurial 개발자이며 두 DAG를 비교하는 시간 및 네트워크 복잡성을 논의하는 이론적 작업에 대해 매우 관심이 있습니다.

해당 DAG는 기록 된 개정으로 구성됩니다. 리비전은 해시 값으로 고유하게 식별됩니다. 각 개정은 이전 개정의 0 (초기 커밋), 하나 (정상 커밋) 또는 그 이상 (병합 커밋)에 따라 달라집니다. 다음 개정 예는 a하기 e각각 차례로 만들었다는 :

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

누군가가 히스토리의 일부만 가지고 누락 된 부분을 검색하려고 할 때 그래프 비교가 그림에 나타납니다. 내가 가진 상상 ac하고 만든 xy기반으로 c:

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

의욕에, 나는 할 것이다 hg pull및 다운로드 de:

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

목표는 그래프에 많은 노드 (예 : 100,000 개 이상)가있을 때 를 식별 d하고 e효율적으로 만드는 것입니다. 효율성 문제

  • 네트워크 복잡성 : 전송 된 바이트 수와 필요한 네트워크 왕복 수
  • 시간 복잡성 : 변경 세트를 교환하는 두 서버가 수행 한 계산량

일반적인 그래프는 위와 같이 몇 개의 병렬 트랙으로 좁아집니다. 또한 일반적으로 같은 (우리가 의욕에 그 머리를 호출) 잎 노드의 소수가있을 것입니다 ey위. 마지막으로 중앙 서버를 사용하는 경우 클라이언트는 종종 서버에없는 몇 개의 변경 세트를 가지게되며, 클라이언트가 서버에서 마지막으로 가져온 사람에 따라 서버는 클라이언트에 대해 100 개 이상의 새로운 변경 세트를 가질 수 있습니다. . 비대칭 용액이 바람직하다 : 중앙 서버는 클라이언트에 비해 적은 계산을 수행한다.


토론은 Google Plus 에서 약간 계속 되었습니다 .
Martin Geisler

답변:


13

이와 관련하여 그래프 노드에는 일종의 고유 식별자 (해시 또는 체크섬)가 있습니다. 따라서 모든 종류의 하위 그래프 동형 테스트를 수행 할 필요가 없으며 두 버전간에 다른 노드 목록 만 있으면되며이 단계에서는 가장자리가 전혀 유용하지 않습니다. SIGCOMM 2011 백서 " 차이점은 무엇입니까? 사전 컨텍스트없이 효율적인 세트 조정"(Goodrich, Uyeda 및 Varghese와 함께)는이 문제를 정확하게 고려합니다. 비례하는 통신량을 사용하여 두 통신 서버 중 하나만 보유하고있는 두 노드가 아닌 노드의 ID를 확인할 수 있습니다. 변경 한 노드 수와 단일 왕복 만 사용 정보를 얻은 후에는 최적의 통신을 통해 두 번째 왕복으로 변경 내용을 쉽게 가져올 수 있습니다.


어, 이거 재미 있겠다! 변경 세트 ID (해시 값)를 직접 비교하면 효과가 있습니다. 우리는 항상 그래프 구조를 항상 사용하려고 노력했습니다. 둘 다 X를 알고 있다면 X의 모든 조상을 알고 있다는 것도 알고 있습니다. 중요한 정보처럼 보이지만 그렇지 않을 수도 있습니다. 포인터를 읽어 주셔서 감사합니다.
Martin Geisler

@David : 정밀도 (현재 Mercurial에서 사용하는 알고리즘 작성자 중 하나입니다). 우리는 실제로 "공통"노드 세트에 관심이 있으며, 누락 된 노드의 값을 알 필요가 없습니다.
tonfa

1
차이점이 무엇인지 알고 있다면 공통점이 무엇인지 알 수 있습니다. 사본의 차이점은 그 차이가 아닙니다. 그러나 공통 부분이 큰 경우에도 차이는 일반적으로 상대적으로 작아야하므로 차이에 비례하는 양의 데이터 만 전달하는 것이 전체 히스토리 DAG 또는 공통 부분을 전달하는 것보다 낫습니다.
David Eppstein

@David : 조상 관계로 인해 실제로 공통 영역의 헤드 (리프 노드)를 계산합니다. 따라서 거대한 공유 기록이 있더라도 여전히 소량의 데이터입니다.
Martin Geisler

사용 된 왕복 횟수도 포함하도록 답변을 업데이트했습니다 (매우 작습니다).
David Eppstein

3

Mercurial을 위해 구현 한 솔루션에서 또 다른 문제는 비대칭 성입니다. 서버로드는 클라이언트로드 비용으로 나가는 대역폭과 CPU 시간 모두 최소화해야합니다.


1
감사합니다.이 문제를 조금씩 업데이트했습니다.
Martin Geisler

0

나에게 2 단계 과정처럼 들린다.

  1. 부모가 c 인 커밋이 있는지 모든 클라이언트에게 물어보십시오.
  2. 그렇다면 c의 모든 자식을 찾으십시오.

1의 작업은 주로 클라이언트 측에서 처리되며 모든 클라이언트는 네트워크를 통해 커밋 해시가 필요하다고 생각합니다.


어떤 시나리오를 설명하고 있습니까? 내가 만든 사건 xy하고 필요로 끌어 ed서버에서? 초기 문제는 (고객으로서) "지점"을 모른다는 것 c입니다.
Martin Geisler
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.