En verimli veri indeksleme tekniği nedir


10

Hepimizin bildiği gibi, Lucene (java için) veya Lucene.NET (.NET için), MurMurHash, B + Ağacı vb. Gibi iyi bilinen dizin oluşturma uygulamaları tarafından kullanılan bazı veri dizinleme teknikleri vardır. No-Sql / Object için Yönlendirilmiş Veritabanı (hangi C # ile biraz yazmaya / oynamaya çalışıyorum), hangi tekniği önerirsiniz?

MurMurhash-2 hakkında okudum ve özellikle v3 yorumları Murmur'un çok hızlı olduğunu söylüyor. Ayrıca Lucene.Net üzerinde iyi yorumlar var. Peki ya genel olarak bellek ayak izleri? Lucene veya Murmur'dan daha az yer kaplayan (ve tabii ki daha hızlı tercih edilirse) etkili bir çözüm var mı? Yoksa en iyi sonuçları almak için özel bir dizin yapısı mı yazmalıyım?

Kendi kodumu yazmaya çalışırsam, iyi bir indeksleme için kabul edilen herhangi bir ölçek, veri düğümünün% 1'i veya veri düğümünün% 5'i gibi bir şey var mı? Herhangi bir yararlı ipucu takdir edilecektir.

Yanıtlar:


10

Sanırım sorunuzdaki bazı şeyleri berbat ettiniz. Lucene (Lucene, NET hakkında hiçbir şey bilmiyorum, ama sanırım aynı) daha sonra sorgulamak ve almak için belgeleri analiz etmek, jetonlara bölmek ve belgeleri saklamak için kullanılan bir kütüphane. Lucene oldukça eski ama etkili bir modele sahip, belgeleri bulmak ve almak için ters çevrilmiş ağaçlar kullanıyor. Daha fazla ayrıntı olmadan, tüm belgeler belirteçlere (terimler) bölünür ve her terim için, belirtilen terimi içeren tüm belgeleri saklayan bir veri yapısı korunur. Bir veri yapısı bir BTree, bir karma tablo kullanılabilir ve en son büyük revizyonlarda kendi veri yapılarınızı bile takabilirsiniz.

BTree ( daha fazla ayrıntı için Wikipedia sayfasına bakın), büyük veri parçalarıyla çalışmaya uygun ve genellikle ağaç benzeri sıralı yapıları diskte depolamak için kullanılan bir tür ağaç veri yapısıdır. Bellek içi için diğer ağaçlar daha iyi performans gösterir.

Murmur karma ( daha fazla bilgi için Wikipedia sayfasına bakın), karma tabloda kullanılan karma işlevler ailesidir. Karma tablonun uygulanması önemli değildir, standart zincirli bir uygulama veya daha gelişmiş açık karma adresleme şeması olabilir. Fikir şudur ki, hash tabloları bir kişinin sıralanmamış bir anahtar kümesinden hızlı bir anahtar almasına izin verir ve aşağıdaki gibi görevlere cevap verebilir: bu anahtar kümesinin bu anahtar kısmı mı? bu anahtarla ilişkilendirilen değer nedir?

Şimdi ana probleminize geri dönelim. Bir kütüphaneniz (Lucene) var ve veri yapıları için her iki veri yapısı da Lucene'de kullanılıyor. Şimdi, karşılaştırılabilir olmadıkları için sorunuzu bu terimlerle cevaplamanın mümkün olmadığını görüyorsunuz.

Ancak, sizinle ilgili ayak izi ve performans sorunun bir parçası. Her şeyden önce, ne tür işlemleri gerçekleştirmeniz gerektiğini bilmelisiniz.

Sadece anahtar için değer almanız mı gerekiyor yoksa bir aralıktaki tüm öğeleri bulmanız mı gerekiyor? Başka bir deyişle düzene ihtiyacınız var mı değil mi? Eğer yaparsanız, bir ağaç daha yardımcı olabilir. Bunu yapmazsanız, bunun yerine daha hızlı olan bir karma tablodan daha fazla kullanılabilir.

Belleğe sığmayan çok fazla veri var mı? Evet ise, disk tabanlı bir çözüm daha yararlı olacaktır (BTree gibi). Verileriniz belleğe sığarsa, en hızlı bellek içi çözümü kullanmaktan ve diski yalnızca depolama alanı olarak kullanmaktan (farklı bir yapıda, çok daha basit).


Çok teşekkür ederim Rapaio :) Bana verdiğiniz noktalar çok yararlı ve daha net bir şey alır ... Çünkü ben bir .NET geliştiricisi ve düz C (öğrenmeye başlarım) ve yeni, hızlı, güvenilir, ölçeklenebilir ancd meraklı Tabii ki tamamen kontrol edilebilir-kısa vadede: çok heyecanlı- teknikleri .. Bu yüzden çok öğrenmem gerekiyor .. Öğrenmek için, çok fazla belge okumaya çalışıyorum ama tahmin edebileceğiniz gibi ben başlangıç ​​çizgisindeyim .. BTree'nin disk üzerinde avantajları olduğunu bilmiyordum (.Net dünyasında, pek çok yazar bunu şöyle açıklıyor: Linked-List gibi hiyerarşik bir veri yapısı ... Daha Fazla!) Çok teşekkür ederim
sihirbazzz

Ve bana izin verirseniz, sizinkinden daha kaliteli bir açıklama / cevap olana kadar, bunu cevap olarak kabul etmek istiyorum .. Ve BTW, Lucene.NET Java'nın Lucene'in bir .NET uygulamasıdır
sihirbazzz
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.