Bir Hashtable ve Sözlük c # pratik boyut sınırları


12

Bir C # 4 Sözlüğü'nün veya Hashtable'ın içerebileceği öğe sayısı ve bu yapıların makul şekilde içerebileceği toplam bayt sayısı için pratik limitler nelerdir. Çok sayıda nesne ile çalışacağım ve bu yapıların ne zaman sorun yaşamaya başladığını bilmek istiyorum.

Bağlam için tonlarca belleğe sahip 64 bit sistem kullanacağım. Ayrıca, bazı form veya 'anahtar' kullanarak nesneleri bulmam gerekecek. Performans talepleri göz önüne alındığında, bu nesnelerin bellekte kalması gerekecek ve birçoğu uzun ömürlü olacak.

Üçüncü taraf veya açık kaynaklı kütüphaneleri kullanmaktan kaçınmam gerekmesine rağmen, diğer yaklaşımları / modelleri önermekte özgürsünüz. Spesifikasyon nedenleriyle, yerel C # ( veya C ++ \ CLI ) kullanarak bu oluşturmak gerekir .


1
Bu şeyleri alay etmek ve farklı kullanım / yükler altında ekleme / kaldırma / arama performansını ölçmek sadece ve bir iki saat sürmelidir. VS2010'un sizin için performans testi iskeleti bile sağladığına inanıyorum. Burada kimse ne derse desin, yazacağınız kodun üzerinde doğrudan veya meta veriler olacak.
İş

Yanıtlar:


8

Belirtilmesi gereken bir şey, sözlüğün nesnenin kendisini tutmayacağıdır (bu, büyük bir bellek ayak izine sahip olabilir), ancak nesneye sadece bir referanstır, bu nedenle nesneler karmaşıksa, bunun Sözlük boyutu üzerinde hiçbir etkisi yoktur.

Hafızadaki bir sözlükte birkaç bin ürün topladım ve mesele, sözlüğün boyutu değil, hafızadaki nesnelerin kendisidir. Bu durumlarda, Sözlüğün kendisi ilgili hafızanın küçük bir kısmıdır.

Büyük Sözlüklerde düşünülmesi gereken bir şey Sözlük kapasitesini manuel olarak yapılandırmak ve yönetmek. Normal koşullar altında .Net bu para cezasını yönetir (mevcut uygulamada, alan biterse, sözlüğün geçerli boyutunun en az iki katı olan bir asal sayıya yeniden boyutlandırılır). Bununla birlikte, büyük bir Sözlük oluşturacağınızı veya Sözlük yerine .Net'i sizin için tahmin edip yeniden boyutlandıracağınızı biliyorsanız (göreceli olarak maliyetlidir) muhtemelen bunu kendiniz yapmanız daha iyidir (kesinlikle başlangıçta) boyut ve muhtemelen daha sonra yeniden boyutlandırma). Bu, sözlüğün kapasitesinin ne olması gerektiği konusunda makul bir sezgisel fikriniz varsa Sözlük kapasitesini yöneterek yapılabilir. Microsoft bunuSözlük nesnesi hakkındaki açıklamalarında MSDN . Ancak, testin ne kadar titiz olduğundan ve .Net platformunun bir sözlük son derece hızlı bir şekilde yeniden boyutlandırıldığında yerine koyduğu başka optimizasyonlar olup olmadığından emin olmasam da , bu yaklaşımın gerçek değeri hakkında bazı tartışmalar var gibi görünüyor .

Bu, nesne ve bellek boyutu hakkında yararlı bir Yığın Taşması sorusudur .


2

Pratik sınırlar, yazılımınızın üzerinde çalıştığı makineye ve bu veri yapılarında gerçekten kaç tane nesne kullanmayı planladığınıza bağlı olabilir. Oded'in belirttiği gibi, int.MaxValue çok sayıda, ancak 2 milyar ürün pratik bir sınıra eşit mi? Hafızadaki birçok öğenin saklanması muhtemelen çok pratik değildir.


0

Belgeler, verilerin fiziksel olarak nerede depolandığını söylemediğinden ve sınırı belirtmediğinden, beklediğiniz maksimum boyutta bir deneme yapmanızı ve depolama ayırmadan önce ve sonra sistem belleğini not etmenizi öneririm.


-1

Geçenlerde github projesi hash-table-shootout'u güncelledim (burada: https://github.com/jimbelton/hash-table-shootout ). Standart gcc sırasız haritasının 40M nesnelerini depolamak için yaklaşık 1.8 GByte ek yükü vardır. Bu benim için oldukça iğrenç görünüyor, ancak en iyi performans sergileyen bellek bile Google sparse_hash_map, 600 Mbayt alıyor ve bunu kullanmak için bir performans cezası ödüyorsunuz. Hız istiyorsanız, dahil edilen algoritmaların Glib GHashTable en hızlısıdır ve iyi bir bellek performansına sahiptir (yaklaşık 1.3 Gbyte ek yük). Karşılaştırma sonuçları burada yayınlanmaktadır: https://jimbelton.wordpress.com/2015/07/01/hash-table-shootout-on-github/

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.