İkili Arama veya B-ağacı indeks güncelleme sorunu

oy
4

Bir yazarın yeni kitabı her gün teslim olduğunu düşünün. Kitap devam eden bir çalışmadır. O değiştirilebilir veya ilave neler yapmakta söylemez.

Senin işin değişiklik ve eklemeler tanımlamak ve (kitabın tamamını her gün okumaya vakti yok kim) yayıncıya boyunca SADECE bu geçmektir

Bu sorunun amacına uygun olarak, kitap ASCII metin ve büyüyen (aslında MySQL yedekleme dosyası) 1m çizgiler oluşur.

Benim şu anki fikir, her satırdan (1k Chars) güvenli bir karmasını (örneğin SHA256) yapmak ve HD üzerinde saklamaktır. karma sadece 32bytes olduğundan dosya sadece 32MB.

yarın gelecek dosyasını almak Sonra, her bir hat için yeni bir karma oluşturma ve önceki günden itibaren karma karşılaştırarak, satır hat geçer.

işlemi tamamlandığında biz ertesi gün için karma dosyası hazır üzerine yazılır.

Karşılaştırma dizesinin bir ikili arama yöntemi Bu dört tekrarlamalar ortalama bir sonuç döndürür (> <işlenen) karşılaştırmak kullanır.

Henüz btree endeksi çözümü kodlu değil, ama bunu nasıl çözecek?

Oluştur 30/10/2008 saat 01:52
kaynak kullanıcı
Diğer dillerde...                            


6 cevaplar

oy
1

Ben kullanırım diff .

Ben kendi programı dahilinde uygulamak gerekirse, ben bulmak için algoritmalar birini kullanmak en uzun ortak altdiziyi hatlarının bir dizi olarak her dosyayı, iki dizinin tedavi.

Cevap 30/10/2008 saat 01:58
kaynak kullanıcı

oy
0

"Yarın gelecek dosyasını almak Sonra, her bir hat için yeni bir karma oluşturma ve önceki günden itibaren karma karşılaştırarak, satır hat geçer."

Dünkü değerlerinin 1m hatları ile karşılaştırıldığında bugünün karma değerlerinin 1m hatları: Anladım.

çizgiler takarken veya çıkarırken oluyorsun? Değilse, bu paralel basit bir dizi karmaları farklı olup olmadığını görmek için okur olduğunu.

ekler veya kaldırma varsa, sen değişimin kapsamını belirlemek için diff algoritmasını kullanmak gerekecektir.

Bütün bu iyi. uygulamak çok zor değil.

Bu bağlamda, şu anlam ifade etmiyor.

Karşılaştırma dizesinin bir ikili arama yöntemi Bu dört tekrarlamalar ortalama bir sonuç döndürür (> <işlenen) karşılaştırmak kullanır.

karma değerlerine sipariş çeşit var mı? Veya bazı ağaç yapısı?

Cevap 30/10/2008 saat 02:20
kaynak kullanıcı

oy
0

1.000.000 çizgilerin bir kitap çok büyük: orada 30 belki vardır - sayfa başına 50 satır, o yüzden cömert olalım ve kitapta 10.000 sayfa demektir sayfa başına 100 satırları varsayalım.

1 kb hatları normal olduğundan daha büyük olan; Temel okunabilirliği hiçbir satır başına birçok karaktere yakın öneriyor. en fazla 1 KB veya yığın 1 KB boyutunda öbekler halinde dosya satırlarını karma niyetinde misiniz? sizin düzeni ile ilgili bir problem herhangi tekrarlanan satırları tekrarlanan bir karma olurdu olmasıdır; Bu satırlardan birini eklenen veya silindi ne zaman tespit asla.

Sen, muhtemelen, çok silinen satırların yayıncı bildirmek gerekir.

Glomek olduğu gibi, ben kullanırım diffdosya üzerinde. Eğer RCS veya CVS kontrolü altındaki dosyayı tutmak, sadece geçerli dosyanın sürümünü ve saklanan önceki sürümleri arasında farklar olurdu. Bununla, siz de bir haftalık veya aylık kümülatif diffs sağlamak mümkün olacaktır.

Ve Herhalde kendim B-ağacı indeksleme geliştirmek olmaz.

Cevap 30/10/2008 saat 02:23
kaynak kullanıcı

oy
0

açıkladığınız çözüm rsync algoritması biraz benzer. tek önemli nokta rsync Orijinalden ofset herhangi birinde hedef dosyasında herhangi bir yere varolan parçalar tanımak olmasıdır.

Dosyalarınızı gerçekten yapılandırılmış şekilde kaydeden eğer önerdiğiniz gibi, biraz kolaylaştırabilir. değilse, bir haddeleme sağlama gerekir.

Ayrıca, sen reorderings tanımak gerekiyor? veya eklemeler / silmeler / değişim tek?

en genel durum böyle gider tam rsync algoritması vardır:

  • parametreleri tanımı:

    1. bir blok boyutu 512 seçin veya 1k genellikle Tamam çalışır.
      • 'güçlü' sağlama seçin. şey MD4 ya şöyle. 64bits bol bulunmaktadır.
      • Bir 'zayıf' haddeleme sağlama seçin. 'Substract' kuyruk bayt ve 'ekle' bir kafa bayt yapmanızı sağlayan bir ileri bir blok 1-byte sağlama almak için. genellikle 16 bit sağlama Tamam çalışır.
  • Eski dosyasının imzası:

    1. Bütün eski dosyanın çapraz, her blokta zayıf ve güçlü hem kendi hesaplar. 16 ve 64 bit sağlama ve 512byte blokları ile bu blok başına 10bytes veya megabayt başına 20kb anlamına gelir. Bu 'imzadır'
  • yeni dosyayla 'yama' ve eski dosyanın imza oluşturmak:

    1. Eski dosyanın imzasını yüklemek, en iyi anahtarları olarak zayıf sağlama ile güçlü sağlama ve blok pozisyon değerleri, bir karma tablodur.
      • yeni bir dosyanın ilk bloğu okumak
      • Yüklenen bloğun zayıf sağlama hesaplamak
      • zayıf sağlama olup olmadığını görmek için karma tabloyu kontrol edin.
      • bulursa, güçlü sağlama hesaplamak ve karma bulunan biri ile karşılaştırmak
      • Her iki toplamlarını eşleşirse, işaret gibi bir bütün blok boyu ilerlemek ve 3. adıma geri dönün, karma blok atfen 'got it'
      • Güçlü sağlama maç olmasaydı, veya zayıf sağlama karma o blokla sonraki byte 'ekle' olduğunu, 'roll' zayıf sağlama, ve 'substract' dan ilk bayt içinde olmazsa kuyruk.
      • yamada 'yeni' bayt listesine kuyruğundan 'eksiltme' bayt eklemek
      • 4. adıma geri dönün
  • Eski dosyaya yama uygulamak

    1. 'Yama' sağlama artı listesini haddeleme sırasında düştü 'yeni' bayt listesi blok eski dosya üzerinde o maç 'got it'.
Cevap 30/10/2008 saat 02:34
kaynak kullanıcı

oy
0

Bu için kullanılan bir tekniktir artan yükleme veri ambarı üzerinde. Eğer bir kaynak sistemi içinde değiştirilen verileri tanımlamak için yeteneği olmayan durumda, verilerin anlık görüntüsünü alabilir ve farklılıkları belirlemek için son anlık ile karşılaştırın. Bu teknik bile bir söz alır konuda Ralph Kimball'ın kitabında ve kullanılan ben tasarımında yer aldı bir uygulama.

Bu yaklaşım olarak çok geniş bir anahtarla bir müzakere algoritması karşı savunmasızdır gerek doğum günü saldırıları . MD5 veya SHA ailesinin herhangi iyi olurdu. Ayrıca doğal tuşları eksik arayan farkı geçer sonrası süreç olmadan silme algılayamaz. Bu hesaplama aslında tablo yapısından haberdar olması gerekmektedir.

Cevap 30/10/2008 saat 09:44
kaynak kullanıcı

oy
0

sizin düzeni ile ilgili bir problem herhangi tekrarlanan satırları tekrarlanan bir karma olurdu olmasıdır; Eğer bu çizgilerin biri eklenen veya silinen zamanı belirtmek asla

Çok iyi bir nokta, ama bir sorun değil. Tekrarlanan çizgi yineleniyor ve tüm çiftleri işleme sonraki aşamada silinir. Yani evet haklısınız, ama bu bir sorun değildir.

"Fark" bağlantısı bana bir uygulamadır ne varsayalım ilgili açıklamaların yer aldığı bir sayfaya götürür? Hiçbir indirme linki burada ne eksik ... herhangi bir dilde kod bulunmadığından vardır?

Bazılarınız bayt seviyesi tanesellik bahsettik. Bu gerekli değildir. Sadece hat düzeyinde ayrıntı hattında şey değişmiştir eğer hat içinde herhangi bir değişiklik bütün çizgi etkiler yapmamı, tüm hat (kayıt) yeniden işlenmesi gerekir çünkü gereklidir.

Bu yüzden her Yaklaşık 1m hatlarıdır iki dosyaları (bugünün enstantane ve dün anlık) 'de yaklaşık 1000 karakter (hayır ikili), satırları karşılaştırıyorsunuz.

Yani SHA256 gibi güvenli karma (MD5 çarpışma vardır ve karşılaştırma yavaş) benim HO dizüstü 30MB / sn yaklaşık işleyebilir kullanarak. Tabii sunucu çok daha hızlı içinden çiğneyecektir.

Dosya zıplarlar 1GB ise, o zaman bütün HASE'lerin yapma konusunda 33sec alır ve pencereler sayfa belleği kullanarak 1Gb dosya okumaya yaklaşık 30 saniye sürer. korkunç değil

Şimdi her dosyada satırları temsil eden hashs iki diziler var. Onları sıralama yaparsanız, şimdi bir ikili arama kullanabilirsiniz, bu yüzden eski dosyaları hashs bir maç için arayan yeni dosyalar hashs yolumuzu yineleme. Bunu bulana yok, o satır değişiklikleri dosyaya eklenir.

çizgilerin kitabı (eski veritabanı) her açıdan bilinmemektedir unutmayın. çizgilerin, değişikliklerin konumu, bu tür değişikliklere düzenin garantisi yoktur.

sayfası tarafından foreward sayfayı okuma önerileri iyidir, ama iki dosya ilk değişim kadar e kadar SMAE sırayla olduğunu varsayar. Bu kabul edilemez. hatlar (satır), herhangi bir sırayla olabilir. Ayrıca hattın taneciklik keyfi bir blok boyu aykırıdır seçmek. Bu görevin amaçları doğrultusunda, çizgiler değişken değildir.

invrementa yükleme o mükemmel bağlantısından: Karşılaştırma Yakalama Dosya: Bu yöntem aynı zamanda anlık diferansiyel yöntemi olarak bilinir. Bu yöntem daha önce tutarak ve veri deposuna ilgilendiren dosyaların görüntüleri sonrasında çalışır. Kayıtlar değişiklikleri bulmak için karşılaştırılır ve kayıt tuşları ekler ve siler bulmak için karşılaştırılır. Bu teknik sayesinde genelde mevcut ve işlem günlükleri varolmayan veya özel bir biçimde ya vardır yok tetikler gerçeğine eski sistemlerden durumunda en uygundur. En eski veritabanları dosyalarına veri damping için bazı mekanizmalar olduğundan, bu teknik periyodik anlık oluşturur ve ardından değişim kayıtları üretmek sonuçlarla karşılaştırır. Kuşkusuz, statik yakalama tüm sorunlar burada mevcuttur. Eklenen karmaşıklığı bilgilerinin tamamı satırları karşılaştırarak meydan tarafından anahtar tanıma ve eşleştirme ile tanıtıldı. Bu teknik, bazı durumlarda, tek çözüm olabilir, doğada karmaşık ve tipik olarak istenen bir durum değildir ancak.

Bu burada en alakalı: Biz terabayt veri ambarlarının dünyasına devam ederken, bir gece olarak sıfırdan veri ambarı yeniden yeteneği dinozor yol gidecek. Veri ambarı güncellenmesi için mantıklı ve verimli bir yaklaşım artan güncelleme stratejisi çeşit gerektirir.

Bu yüzden ben o zaman doğru yolda olduğumu tahmin? Bir btree endeksi bir avantaj göze olmaz?

Cevap 31/10/2008 saat 08:47
kaynak kullanıcı

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more