Veri yapılarını kullanan algoritmalar ile veritabanlarını kullanan algoritmalar arasındaki farklar nelerdir?


10

Genel Soru

Veri yapılarını kullanan algoritmalar ile veritabanlarını kullanan algoritmalar arasındaki farklar nelerdir?

Bazı Bağlamlar

Bu bir süredir beni rahatsız eden bir soru ve bunun için ikna edici bir cevap bulamadım.

Şu anda, elbette, veri yapılarını yoğun bir şekilde içeren algoritmalar hakkındaki anlayışımı güçlendirmeye çalışıyorum. Bunlar Çanta, Kuyruk, Yığın, Öncelik Kuyruğu ve Yığın gibi temel yapılardır.

Ayrıca son kullanıcı tarafından işlenen ve gönderilen veya program tarafından işlenen verileri depolamak için günlük olarak veritabanları kullanıyorum. Veriyi, veri tabanındaki tablolara dayanarak oluşturulan kendi veri yapılarına sahip bir DAL aracılığıyla alıp gönderirim.

Sorularım, bana artan veya azalan bir şekilde sipariş vermek için veritabanını kullanarak verileri sıralama seçeneğine sahip olduğumda veya verileri mantığıma alıp yüklediğimde, bu verileri öncelik kuyruğunda işlediğinde ve yığın sıralamasında geldiğimde geliyor hepsini. Ya da bir diğeri, kayıtların bir alt kümesini yüklemek yerine, ilgilendiğim kaydı veya kayıtları bulmak için ikili arama gibi bir şey kullanmak yerine veritabanını kullanarak kayıtları aramak olacaktır.

Aklımda, iletişim pahalı olduğu için göndermeden önce veritabanı ucunda çok sayıda işlem yapılmasına çalışacağım. Bu aynı zamanda veriyi veritabanınınkinden ziyade verileri işlemek için tamamen kendi mantığınız içinde tanımlanmış algoritmaları ve veri yapılarını ne zaman kullandığınızı merak ediyor.

İşte sorular ...

Sorular

  1. Veri yapıları ve veritabanları arasındaki farklar nelerdir?
  2. Veritabanınınkini değil, yalnızca kendi mantığınız içinde tanımlanan veri yapılarını kullanan algoritmaları ne zaman kullanıyoruz?
  3. @Harvey post: Veritabanındaki yöntemlerin kullanımı ne zaman kendi mantığınızdaki yöntemlerden daha az verimli olur?
    • @mirculixx post: Bir yöntemi etkili kılan nedir?
  4. @Harvey post: Veri yapıları olan verileri, veritabanında yapmaktan daha hızlı nasıl işliyor?

Açıklamalar

  1. @ Hibe yazısı: Normalde çalıştığım veritabanları ilişkiseldir ve bu sorular onlarla çalışmaktan çıkmaktadır. Ancak, bu soruların herhangi bir kalıcılık çerçevesi için geçerli olduğunu düşünüyorum (çerçeve dediğimde, bunu en genel anlamda kastediyorum).

Belirli bir bağlamı olmayan cevapların zor olduğunu biliyorum. Düşünce yiyecekleri, tavsiye veya tartışma noktaları temelde aradığım şeydir ve en çok takdir edilecektir!


Datomic.com veritabanı geleneksel ilişkisel olanlardan daha kullanıcıya yakındır. Sadece geleneksel veritabanlarına mı bakıyorsunuz?
Meslek

@ İş Hayır, ilişkisel veritabanları burada düşündüğüm tek şey değil. Bu daha çok mantıktaki veri yapıları ile veritabanı / kalıcılık birimindeki veri yapıları arasındaki farkı anlamakla ilgilidir.
hulkmeister

Genel bir kural olarak söyleyebilirim - eğer mümkünse bir veritabanı kullanın, ancak çok yavaş olursa, veri yapılarını kullanmaya başvurunuz. Veri çoğaltma (örn. Önbellekleme) kötüdür, çünkü ikisini senkronize tutmanız gerekir, bu yüzden yapamadığınız sürece bundan kaçının.
Meslek

Veritabanına yalnızca sıralamak için veri gönderilsin mi? Fikrini değiştirmek için blok etrafında sürüş gibi?

Yanıtlar:


18

Veri Yapıları çoğunlukla:

  1. Bellek sakini,
  2. Geçici,
  3. Boyut olarak sınırlı,
  4. Kilitler veya değişmezlik gibi eşzamanlılık mekanizmaları eklemeden yeniden giriş yapmamak,
  5. ASİT uyumlu değil ,
  6. Dikkatlice seçilirse hızlı.

Veritabanları çoğunlukla:

  1. Disk bağlı,
  2. Kalici,
  3. Büyük,
  4. Güvenle eşzamanlı,
  5. İşlem özelliklerine sahip ASİT uyumlu ,
  6. Veri yapılarından daha yavaş

Veri yapıları bir yerden başka bir yere aktarılmalı ve bir program içinde dahili olarak kullanılmalıdır. En son ne zaman veri kullanarak bir web sayfasından bir web sunucusuna veri gönderdiniz veya tamamen bellekte yerleşik olan bir veritabanında hesaplama yaptınız?

Veritabanı sistemleri, veri yapılarını dahili uygulamalarının bir parçası olarak kullanır. Bu bir boyut ve kapsam sorunudur; Eğer program dahilinde veri yapılarını kullanır, ancak bir veritabanı sistemi olan kendi başına bir program.


Web sayfası-web sunucusu söz konusu ile ilgili olarak, orada veritabanını kullanmayacağınızı kabul ediyorum, ancak veriyi işlemek için bu verileri işlemek veya çevirmek için bir sunucu uygulaması olma olasılığını görüyorum. Orta katman ile veri katmanı arasında, işlerin biraz karıştığı yer. Soruyu basitleştirmek için, veritabanındaki yöntemlerin kullanımı ne zaman mantıktaki yöntemlerden daha az yararlı olur?
hulkmeister

1
DAL'ın ekmeği ve tereyağı bu değil mi? DAL'ler, nesneler ve veritabanı kayıtları arasındaki geçişi kolaylaştırmak için mevcuttur. DAL'ler bir veritabanıyla yapmak isteyeceğiniz şeyin yaklaşık yüzde 80 ila 90'ı için iyidir, ancak geri kalan yüzde 10 ila 20 için ham SQL'e veya saklı yordamlara geri dönmek isteyebilirsiniz, çünkü daha verimlidir.
Robert Harvey

Sıralama / filtreleme örneğinizde, büyük olasılıkla bu tür bir işlemi veritabanı sunucusunda yapmak istediğiniz doğrudur. Ancak büyük olasılıkla bu işlemin sonucunu bir tür veri yapısı olarak alırsınız.
Robert Harvey

Verdiğiniz noktalar gerçekten bilgilendirici oldu. Ancak, hala doğrudan veya sadece mantık veya her ikisi de veri yapıları ile doğrudan veri tabanı ile çalışan yöntemler (veya algoritmalar) hakkında nagging bir şey var. Her iki listenin 6. maddesine bakıyorum ve akla gelen soru, biri diğerinden daha hızlı mı? Ben her zaman kaynak veri ile çalışmak şeyler gitmek için en hızlı yolu olduğunu algıladı. Yayınınızda güncelleme yapabilirsiniz - tekrar okuyacağım.
hulkmeister

1
Veritabanları birkaç nedenden dolayı daha yavaştır. Önbelleğe alma işlemine rağmen, genellikle birden çok tablo içeren bir yürütme planına sahip olması gereken, derlenmesi gereken bir SQL ifadesi kullanarak diskteki verileri okumalısınız. Süreç çok daha karmaşık. Buna ek olarak, genellikle sonuçları tel üzerinden aktarmanız gerekir; burada verileri veri yapılarına çevirirsiniz, böylece onunla çalışabilirsiniz.
Robert Harvey

6

Veri yapıları ve veritabanları arasındaki farklar nelerdir?

Soyut seviyede, orada yok - bir veritabanı olan bir veri yapısı.

Belirli bir düzeyde, veritabanları genellikle verileri ekleme, güncelleme, alma, birleştirme veya başka bir amaç (veya bir kombinasyon) için optimize edilmiş bir formatta kalıcı hale getirme amacına sahiptir.

Örneğin, RDBMS'deki bir tabloyu bir veri dizisi olarak karşılaştırırsanız, fark algoritmanın çalışma zamanında, yazmanız gereken kod miktarında, algoritmayı çalıştırmak için gereken bellek miktarında veya program / algoritmanızın dışından verilere çalışma / erişme esnekliği.

Veritabanınınkini değil, yalnızca kendi mantığınız içinde tanımlanan veri yapılarını kullanan algoritmaları ne zaman kullanıyoruz?

Eğilimi tartışırım

a) Verileri, belirli bir algoritmanın çalışma süresi veya amacının ötesinde erişilebilir şekilde saklamanız gerekiyorsa bir veritabanı kullanmak.

b) çalışma zamanı hızı önemliyse veya kalıcılık gerekli değilse kendi (bellek içi) veri yapınızı kullanmak için

Örneğin, algoritmanız müşteri kayıtlarını işliyorsa, bu müşteri kayıtlarını (belirli bir alandaki tüm müşterileri bulmak için) daha sonra başka bir program / algoritma tarafından kullanılmak üzere ve tamamen farklı bir amaç için (en değerli müşterileri bulmak için) saklamak isteyebilirsiniz ). Bu durumda, verileri saklamak için bir veritabanı kullanmak muhtemelen iyi bir fikirdir.

Bununla birlikte, performans nedenlerinden ötürü, verilerin sürekli olarak kalıcı olması gerekmeyen bellek içi veritabanları kavramının bulunduğunu unutmayın. Örneğin Redis veya HANA .

Veritabanındaki yöntemlerin kullanımı ne zaman kendi mantığınızdaki yöntemlerden daha az verimli olur?

Cevap büyük ölçüde koşullara ve kullanılan (tip) veritabanına bağlıdır. Soruyu "yöntemi etkili kılan nedir?" Daha sonra kendi veri yapınız için kullanacağınız yöntemleri (= algoritma), veritabanı tarafından kullanılan yöntemlere karşı değerlendirme alıştırması haline gelir. Ayrıca bir sonraki noktaya bakın.

Veri yapıları olan verileri, veritabanında yapmaktan daha hızlı nasıl işler?

Yine, bu özelliklere bağlıdır. Genel olarak, bellekte bulunan, algoritmanızı çalıştıran işleme doğrudan erişilebilen verilerin işlenmesi, başka bir işleme (aynı bilgisayarda veya ağ üzerinden) bir istek göndermekten ve sonuçları geri göndermesini istemekten daha hızlıdır . Ancak veriler zaten veritabanında bulunuyorsa, bir komut göndererek - iki tabloyu birleştirmek ve bazı toplama işlevlerini hesaplamak için bir SQL deyimi söyleyin - ve verilerin yalnızca küçük bir özetini veya alt kümesini almak, tüm verileri aktarmadan çok daha verimli olabilir. veriler ve sonuçların yerel olarak hesaplanması (kendi veri yapılarınızı kullanarak).


1

Disk erişimi öncelikle bu işlemde en pahalı olanıdır, ağ erişiminden daha sıktır (http://serverfault.com/questions/238417/are-networks-now-faster-than-disks). Veritabanınız en az 1 Gbps ağda ve web \ uygulama sunucunuzla aynı ağda bulunmadıkça, ağ performansı daha büyük veri kümeleri için disk performansı kadar önemli olmayacaktır. Veya verileriniz tipik ağ erişiminden daha hızlı olacak çok hızlı katı hal disklerinde bulunuyorsa. Ayrıca, veritabanları uygulama sunucunuzla aynı sunucuda bulunuyorsa, veritabanları genellikle TCP / IP kullanmak yerine adlandırılmış yöneltmeler gibi bir IPC mekanizması sağlar.

İstekler arasında \ enire veri yapısının çoğunu bellekte tutabiliyorsanız, bu genellikle en hızlı bahsiniz olacaktır. Yapamıyorsanız, normalleştirilmiş tablolarla iyi bir veritabanı yapısını ve özellikle milyonlarca kaydı olan bir sistemde küçük kayıt kümelerinden başka bir şey için arama ve güncelleme performansı için uygun endeksleri yenmek zordur.

İlişkisel Veritabanları genellikle kaputun altında bir B + ağacı veya bunun bir varyantını kullanır ve sık erişilen kayıtlar için disk ve tampon havuzları üzerinde veri hizalama gibi birçok optimizasyona sahiptir. Bu, özellikle toplama veya filtreleme söz konusu olduğunda, büyük veri kümelerini hızlı bir şekilde işlemede mükemmel hale getirir.


Lütfen bunu doğru yapıp yapmadığımı söyle. Söylediklerinizi uygulamak, verilerle çalışmayı düşündüğümde, çalışma kümesini bellekte önbelleğe alabilirsem, bu daha hızlıdır. Aksi takdirde, bu sonuçları sunmak için veritabanını kullanmayı deneyin veya veritabanını daha fazla sorgulamayı dahil etmenin bir yolunu mu buldunuz?
hulkmeister

@hulkmeister evet, veri kümesi çok küçük veya veritabanı yavaş bir ağ üzerindeki konumunuza uzak değilse genellikle.
Peter Smith

0

Bir veritabanı ile ne demek istiyorsun? MySQL veya SQL Server gibi ilişkisel bir veritabanı mı kastediyorsunuz? İlişkisel veritabanı, ilişkisel model tarafından tanımlanan işlemlerin bazı alt kümelerini destekleyen bir meta-veri yapısıdır . 60'larda Edgar Codd tarafından en çok çalışılan ilişkisel model teorisi.

İlişkisel model çok genel bir amaç ve esnektir, ancak bu, verilerdeki veya erişim örüntülerindeki yapıdan hiçbir şekilde yararlanamayacağı anlamına gelir. Veri yapıları, veriler ve bunlara nasıl erişileceği hakkında bir şeyler biliyorsanız faydalıdır. Örneğin, bir veri yapısına koyduğunuz son verilerin istediğiniz ilk veri olacağını biliyorsanız, bir yığın kullanabilirsiniz.

İlişkisel veritabanını bir meta-veri yapısı olarak adlandırdım çünkü genellikle ilişkisel bir tablonun soyut veri yapısını oluşturmak için yığınlar, kuyruklar, ağaçlar ve listeler gibi birçok veri yapısını kullanan oldukça büyük bir yazılım dizisi.


Maalesef, son paragraf ile ilgili olarak "oldukça bit tomar" ın ne anlama geldiğine dair bir açıklamaya ihtiyacınız var mı?
hulkmeister

@hulkmeister, üzgünüm 'bit' değil 'büyük' ​​olmalıydı. ilişkisel model çok soyut ve oldukça karmaşıktır. Gerçekten yeterli performans gösteren bir uygulama sağlamak, özellikle de ACID (Atomiklik, Tutarlılık, İzolasyon, Dayanıklılık) sağlayan bir sahne sağlamak, perde arkasında çalışan oldukça karmaşık kodlar gerektirir
Charles E. Grant
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.