2011-07-18 14 views
6

Przeczytałem tutaj w SO, że Hashtable i Dictionary są prawie takie same, z wyjątkiem zalet unikania boksowania/rozpakowywania.Słownik vs użycie pamięci Hashtable

Korzystanie mrówki Profiler mierzę bardzo prostą aplikację z następujących struktur:

class Node 
{ 
    Dictionary<string, Node> Children = new Dictionary<string, Node>(); 
} 

i

class NodeOld 
    { 
     Hashtable Children = new Hashtable(); 
    } 

Ok, listę 1,5 mln przypadków pierwsza trwa około 140 Mb, podczas gdy druga potrzebuje więcej niż 700 Mb (system 64-bitowy).

A zatem istnieje ogromna różnica w implementacji, prawda?

mrówki Profiler prezentuje ogromną liczbę obiektów Hashtable + wiadro na dużym rozmiarze przykład ...

Tak, jest tam opcja odpowiednik (pamięć wiedzą) dla słowników jeśli już trzymać się 1.1?

+0

Podejrzewam, że słownik jest zaimplementowany przy użyciu samowyrównującego drzewa binarnego zamiast tabeli mieszania. Czy zużycie pamięci zostało wykryte po zebraniu śmieci lub po prostu skumulowane? Gdy zmieni się rozmiar Hashtable (w miarę dodawania kolejnych elementów), najprawdopodobniej będzie tworzyć coraz więcej segmentów (choć starsze będą kwalifikowały się do gromadzenia). –

+0

dla hali, która zużywa 700 MB, wiele z nich jest pustych ? – saus

+0

Opisano wewnętrzną implementację. HashTable i Dictionary http://msdn.microsoft.com/en-us/library/ms379571%28v=vs.80%29.aspx – hatchet

Odpowiedz

1

Nawet jeśli utknąłem na .NET 1.1, nie przechowywałbym 1,5 miliona wystąpień w pamięci, więc nie przejmowałbym się. Hashtable jest prawdopodobnie najlepszą strukturą danych implementującą tablicę skrótów, którą można uzyskać pod względem zużycia pamięci i prędkości w .NET 1.1. Oczywiście, jeśli wyjaśnisz swój scenariusz bardziej szczegółowo i zauważysz, że Hashtable jest wąskim gardłem dla twojej aplikacji, mogą istnieć lepsze rozwiązania.

Powiązane problemy