B-Ağaçları ve Diğer Veri Yapıları Katı Hal Sürücülerinin Gelişimi ile Eski Olacak mı?


15

Günümüzde birçok (belki de çoğu?) Veritabanı uygulaması veri depolamak için B-Ağaçları ve varyasyonları kullanır, çünkü bu veri yapısı bir sabit diskteki okuma, yazma ve arama işlemlerini optimize eder (ve bu işlemler de genel verimlilikte önemli bir rol oynar. veritabanları).

Katı Hal Sürücüler (SSD'ler) geleneksel sabit diskleri (HDD'ler) tamamen dışarıda bırakmalı mıdır, ancak doğrudan erişim belleğinde daha verimli çalışan veri yapılarına yer açarak B-Ağaçlarının ve varyasyonlarının eski olacağını söyleyebilir miyiz? Eğer öyleyse, bu yapılar ne olacak? (örneğin, karma tablolar, AVL ağaçları)


Bir veritabanı uygulama açısından eski mi yoksa genel olarak mı veritabanı uygulamaları dışında başka birçok uygulamaya sahip olduklarını mı soruyorsunuz?
Pemdas

Veritabanı açısından.
Daniel Scocco

Yanıtlar:


21

B-Ağaçları çoğunlukla sabit diskteki veritabanı dizinleri için kullanılır, ancak birden çok önbellek katmanı ve sanal bellek ile modern bellek heirarchy göz önüne alındığında, bellek içi veri yapısı olarak bile avantajları vardır. Sanal bellek bir SSD'de olsa bile, bu değişmez.

C ++ 'da epeyce yazdığım bir bellek içi B + tarzı çok yollu ağaç kütüphanesi kullanıyorum. Bu olabilir başlangıçta yazılmıştır sebebi daha iyi önbellek kullanmaya çalışmaktı - - performans avantajları vardır ama bu şekilde çalışmıyor sık itiraf etmeliyim. Sorun, öğelerin ekler ve siler üzerinde düğümler içinde hareket etmesi gerektiği anlamına gelir, bu da ikili ağaçlar için gerçekleşmez. Ayrıca, bunu optimize etmek için kullandığım düşük seviyeli kodlama korsanlarından bazıları - muhtemelen, optimize ediciyi karıştırıp yenilgiye uğrattı.

Her neyse, veritabanlarınız bir SSD'de depolansa bile, bu hala blok odaklı bir depolama cihazıdır ve B-Ağaçları ve diğer çok yollu ağaçları kullanmanın hala bir avantajı vardır.

ANCAK yaklaşık on yıl önce önbellek-habersiz algoritmalar ve veri yapıları icat edildi. Bunlar, önbelleklerin boyutu ve yapısından habersizdir - (asimptotik olarak) herhangi bir bellek heirarşisinin mümkün olan en iyi kullanımını sağlarlar. B-Ağaçları en iyi şekilde kullanmak için belirli bir hafıza heirarşisine "ayarlanmalıdır" (oldukça geniş bir çeşitlilik için oldukça iyi çalışırlar).

Önbellek kayıtsız veri yapıları henüz vahşi doğada sık görülmez, ancak normal bellek içi ikili ağaçları eski haline getirebilirler. Ayrıca, küme boyutu veya sabit disk önbellek sayfası boyutunun ne olduğunu umursamadıkları için sabit diskler ve SSD'ler için de değerli olabilirler.

Van Emde Boas düzeni önbelleksiz veri yapılarında çok önemlidir.

MIT OpenCourseware algoritmaları kursu önbellek kayıtsız veri yapılarının bir kısmını içerir.


1
İlginç. Bu konuyu daha fazla keşfetmek için bazı iyi işaretçiler verdiniz (cinas yok!). Teşekkürler.
Daniel Scocco

Bu MIT kursu ayrıca önbellek kayıtsız veri yapıları hakkında bilgi içerir.
dan_waterworth

Merhaba, B-ağacının SSD'ler nedeniyle değil, önbellek-kayıtsız veri yapıları nedeniyle eski olacağını mı kastettiniz? Peki DBMS'de blok yönetimi gibi diğer veri yapılarına ne dersiniz?
Yang Bo

@ user955091 - Önbellek-habersiz veri yapıları (önbellek-oblivious modelinde optimal olan yapılar anlamlıdır) demek istedim, ama o zamanlar hakkında biraz fazla heyecanlandım. Diğer veri yapıları yakın zamanda kaybolmayacak. Bir kere, önbellek tek performans sorunu değil - paralellik farklı taleplerde bulunuyor. Ayrıca, anahtar tabanlı siparişe ihtiyaç duymak genellikle özel bir durumdur - normalde hash tabloları kraldır. Önbellek dostu olarak "rastgele" bir düzen görmek zor olabilir, ancak öğeyi doğrudan getirmek için bir erişim yenmek zordur - yerele ihtiyacınız yoktur .
Steve314

3

A priori, evet, çoğu veritabanı motorunun yeniden yazılması gerekecek, çünkü B-Tree artık verileri depolamak için en verimli veri yapısı olmayacak, çünkü diskin yavaş hareket ettiği ve verilerin getirildiği bir sabit sürücüde konumun hepsi önemli bloklar halinde, yani verilerde yapılacak herhangi bir değişikliğin:

  1. Kafayı disk üzerinde doğru konuma getirin (~ 10ms).
  2. Diskin dönmesini bekleyin (10k rpm'de, saniyede 167 dönüş anlamına gelir, ancak ortalama olarak sadece yarım dönüş bekleriz, bu yüzden ~ 3ms).
  3. Bloğu okuyun (~ 3ms).
  4. RAM'de değiştirin. (~ 10ns)
  5. Başı tekrar disk üzerinde doğru konuma getirin (tekrar ~ 10 ms).
  6. Diskin tekrar dönmesini bekleyin (~ 3ms tekrar).
  7. Bloğu yazın (~ 3ms).

Bu 10 + 3 + 3 + 10 + 3 + 3 = 34 ms

Disk üzerindeki konumdan bağımsız olarak SSD'de aynı işlemi yapmak sadece 1 ms'dir.

Bir hashtable çok daha hızlı olduğu için, bir hashtable'ın daha iyi bir yedek olacağını düşünebiliriz.

Tek sorun, hashtable'ların sipariş koruması olmadığı ve Van Emde Boas'ın yaptığı gibi önceki ve sonraki bulmak mümkün değildir.

Görmek:

  1. http://en.wikipedia.org/wiki/Van_Emde_Boas_tree
  2. http://bryanpendleton.blogspot.com/2009/06/cache-oblivious-data-structures.html

Sonraki ve öncekini bulmak neden önemlidir? Tüm öğelerin x'den büyük ve z'den küçük olduğunu düşünün, öncekini bul ve sonrakini bul ile dizinleri kullanmanız gerekir.

Tek sorun, sipariş koruma yeteneklerine sahip hashtable bulamadık. Belki de B ağacındaki kepçenin boyutu önemli olacaktır, ancak bu önbellek kayıtsız algoritmalarıyla çözülür.

Yani bunun açık uçlu bir sorun olduğunu söyleyebilirim.


Karma tablo (normalde) önbellek habersiz WRT'nin performansını modellemesidir, ancak bu, bu modelde etkili olduğu anlamına gelmez. Sorun şu ki, hash işlevleri normalde öğeleri "rastgele" dağıtmak için tasarlanmıştır - bu nedenle hash tabloları sıralanmamıştır ve neden zayıf konumlara sahiptirler. Bu, bitişik tuşlara sahip bir dizi öğeyi tanımlayabilseniz bile, blok başına iki veya daha fazla öğeyi okumaktan yararlanamayacağınız anlamına gelir (SSD'ler hala blok aygıtlardır).
Steve314

1
Tabii ki hash bazen "anahtar dönüşümü" olarak da adlandırılır ve dönüşümün "rastgele" olması gerekmez - belki de makul derecede verimli sıralı erişime izin veren bir karma işlev tanımlamak mümkündür (aramayı ortadan kaldırmaz - bilgi sonuçta hash fonksiyonu - en aza indirgemek) ve hash çarpışmalarını nadir tutarken bazı yerellik faydaları sağlar.
Steve314
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.