Ağ üzerinden verimli DAG karşılaştırması


11

İçinde dağıtılmış sürüm kontrolü sistemleri (örneğin, bir Mercurial ve Git ) verimli bir şekilde yönlendirilmiş karşılaştırma asiklik grafikler (DAG'ler) için bir ihtiyaç vardır. Ben bir Mercurial geliştiricisiyim ve iki DAG'ı karşılaştırmanın zamanını ve ağ karmaşıklığını tartışan teorik çalışmaları duymakla çok ilgileniriz.

Söz konusu DAG'lar kaydedilen revizyonlardan oluşur. Revizyonlar bir karma değeri ile benzersiz bir şekilde tanımlanır. Her revizyon, önceki revizyonların sıfırına (ilk taahhüt), bir (normal taahhüt) veya daha fazlasına (birleştirme taahhüdü) bağlıdır. İşte revizyonları bir örnek aiçin ebirbirlerine ardına yapılmıştır:

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

Grafik karşılaştırması, biri tarihin sadece bir kısmına sahip olduğunda ve eksik kısmı almak istediğinde resme gelir. Ben hayal aetmek cve yapılan xve yesas c:

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

Mercurial, ben yapacağını hg pullve indirmek dve e:

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

Amaç, grafiğin çok sayıda (örneğin 100.000'den fazla) düğüme sahip olduğunu tanımlamak dve everimli bir şekilde yapmaktır. Verimlilik her ikisini de ilgilendirir

  • ağ karmaşıklığı: aktarılan bayt sayısı ve gereken ağ gidiş-dönüşlerinin sayısı
  • zaman karmaşıklığı: Değişiklik kümelerini değiştiren iki sunucu tarafından yapılan hesaplama miktarı

Tipik grafikler, yukarıdaki gibi birkaç paralel iz ile dar olacaktır. Ayrıca tipik olarak sadece bir avuç yaprak düğümü olacaktır (bunlara Mercurial'ta başları diyoruz) eve yyukarıda. Son olarak, merkezi bir sunucu kullanıldığında, istemcinin sunucuda olmayan birkaç değişiklik kümesi olurken, istemcinin sunucudan en son ne zaman önce çekildiğine bağlı olarak, sunucu istemciler için 100'den fazla yeni değişiklik kümesine sahip olabilir. . Bir asimetrik bir çözüm tercih edilir: merkezi sunucu müşterilerine kıyasla çok az hesaplama yapmalıdır.


Google Plus'ta tartışma biraz devam etti .
Martin Geisler

Yanıtlar:


13

Bu bağlamda, grafik düğümlerinin bir tür benzersiz tanımlayıcısı (karma veya sağlama toplamı) vardır, değil mi? Bu nedenle, herhangi bir alt çizgi izomorfizma testi yapmanız gerekmez, sadece iki sürümünüz arasında farklılık gösteren düğümlerin bir listesine ihtiyacınız vardır ve kenarlar bu adım için gerçekten yararlı değildir. SIGCOMM 2011 makalem " Fark nedir? Önceden bağlam olmadan verimli set mutabakatı"(Goodrich, Uyeda ve Varghese ile) tam olarak bu sorunu göz önünde bulundurur: yalnızca orantılı olan bir miktar iletişim kullanarak, iki iletişim sunucusunun biri tarafından değil, her ikisi tarafından tutulan düğümlerin kimliklerini belirleyebileceğiniz ortaya çıkar. değiştirilen düğümlerin sayısına ve yalnızca tek bir gidiş-dönüş kullanarak Bu bilgilere sahip olduğunuzda, değişiklikleri yine optimum iletişim ile ikinci bir gidiş-dönüşte çekmek kolaydır.


Kulağa ilginç geliyor! Değişiklik kümesi kimliklerinin (evet, bunlar karma değerleridir) doğrudan karşılaştırmasının işe yarayacağını biliyorsunuz. Biz her zaman grafik yapısını da kullanmaya çalışıyoruz: ikimiz de X'i tanıyorsak, X'in tüm atalarını bildiğinizi de biliyorum. Bu önemli bir bilgi gibi görünüyor, ama belki de değil. Şimdi makaleni okuyacağım, ibre için teşekkürler!
Martin Geisler

@David: Hassasiyet (Mercurial tarafından şu anda kullanılan algoritmanın yazarlarından biriyim). Aslında "ortak" düğümlerin setini önemsiyoruz, eksik düğümün değerini bilmeye gerek yok.
tonfa

1
Neyin farklı olduğunu biliyorsanız, ortak noktaların ne olduğunu da bilirsiniz: kopyasının olduğu her şey farkın bir parçası değildir. Ancak, ortak kısım büyük olsa bile fark tipik olarak nispeten küçük olmalıdır, bu nedenle sadece farkla orantılı bir miktarda veri iletmek, tüm geçmiş DAG veya ortak kısmı iletmekten daha iyidir.
David Eppstein

@David: Ata ilişkisi nedeniyle aslında ortak bölgenin kafalarını (yaprak düğümleri) hesaplıyoruz. Büyük bir paylaşılan geçmiş olsa bile, bu hala küçük bir veri miktarıdır.
Martin Geisler

Cevabımı da kullanılan (çok küçük olduğu ortaya çıkıyor) gidiş-dönüş sayısını da içerecek şekilde güncelledi.
David Eppstein

3

Mercurial için uyguladığımız çözümde, başka bir endişe asimetriydi: sunucunun yükü, hem müşterinin yükü pahasına hem giden bant genişliği hem de CPU zamanı için en aza indirilmelidir.


1
Teşekkürler, bunu not etmek için soruyu biraz güncelledim.
Martin Geisler

0

Bana iki aşamalı bir süreç gibi geliyor.

  1. tüm müşterilere ebeveynin nerede olduğunu taahhüt eder mi diye sor
  2. öyleyse, tüm c çocuklarını bulun

Görev 1 Bence esas olarak müşteri tarafında işlenir ve tüm müşteri net üzerinden kesin karma gerekir.


Hangi senaryoyu tanımlıyorsunuz? Yaptığım vaka xve yve ihtiyaç çekimine bağlı olarak eve dsunucudan? Buradaki temel sorun, ben (müşteri olarak) "dallanma noktasını" bilmiyorum c.
Martin Geisler
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.