C# Dictionary: schneller Zugriff, aber weniger Speicherbedarf
Möchte ich einige beraten auf die beste Art und Weise zu speichern und Zugriff mit minimalen Speicherbedarf und maximale Zugriffszeit.
ZB.
für jedes Fahrzeug machen ich will speichern von Modell und Namen.
habe ich mir einige Gedanken unten:
Option 1:
Dictionary<string, Dictionary<string, string>> values = new Dictionary<string, Dictionary<string, string>>();
Dictionary<string, string> list = new Dictionary<string, string>();
list.Add("2001", "Jetta S");
list.Add("2002", "Jetta SE");
list.Add("2002", "Jetta LE");
values.Add("VolksWagen", list);
Option 2:
Dictionary<string, List<KeyValuePair<string, string>>> values2 = new Dictionary<string, List<KeyValuePair<string, string>>>();
<pre lang="xml">List<KeyValuePair<string, string>> list2 = new List<KeyValuePair<string, string>>();
list2.Add(new KeyValuePair<string, string>("2001", "Jetta S"));
list2.Add(new KeyValuePair<string, string>("2002", "Jetta SE"));
list2.Add(new KeyValuePair<string, string>("2002", "Jetta LE"));
values2.Add("VolksWagen", list2);
Option 3:
Dictionary<string, List<string>> values1 = new Dictionary<string, List<string>>();
List<string> list1 = new List<string>();
list1.Add("2001:Jetta S");
list1.Add("2002:Jetta SE");
list1.Add("2002:Jetta LE");
values1.Add("VolksWagen", list1);
- Option 1: schneller Zugriff machen und
Namen, aber die meisten Speicher-footprint - Option 2: schnellen Zugriff machen und
Namen, aber mehr Speicherbedarf - Option 3: langsame access machen und
name (Parsen), aber
weniger Speicherbedarf
es wäre mehr als 1500 Wörterbücher wie oben.
Anregungen für schnellsten Zugriff, aber weniger Speicherbedarf schätzen?
Dank.
"mit minimalen Speicherbedarf und maximale Zugriffszeit." - Sie sind in der Regel gegenüber Einschränkungen (Zeit versus Raum)
Nicht option 1 nur eine Ausnahme werfen, auf doppelte Schlüssel?
Wie oft werden diese Listen aktualisiert?
Persönlich mag ich den einfachen und lesbaren code, es sei denn, der code ist zu langsam, als dass ich dazu gezwungen werde, zu Gesicht, das performance-Problem. Ich glaube, jeder hat gesehen
vorschlagen zum erstellen einer Struktur zur Kapselung von Jahres-und make - Leistung wird die gleiche wie die der KeyValuePair aber code wäre viel besser lesbar.
Nicht option 1 nur eine Ausnahme werfen, auf doppelte Schlüssel?
Wie oft werden diese Listen aktualisiert?
Persönlich mag ich den einfachen und lesbaren code, es sei denn, der code ist zu langsam, als dass ich dazu gezwungen werde, zu Gesicht, das performance-Problem. Ich glaube, jeder hat gesehen
List<KeyValuePair<K,V>>
würde mich ein wenig seltsam.vorschlagen zum erstellen einer Struktur zur Kapselung von Jahres-und make - Leistung wird die gleiche wie die der KeyValuePair aber code wäre viel besser lesbar.
InformationsquelleAutor Santosh | 2011-02-16
Du musst angemeldet sein, um einen Kommentar abzugeben.
SortedList<TKey,TValue>
ist eine flache Liste (also keine große Zunahme der memory-footprint), das nutzt binäre-Suche für access - soO(log(n))
- nicht so schnell wieDictionary<TKey,TValue>
beiO(1)
- aber viel besser als einList<T>
(oder andere lineare Suche) inO(n)
.Wenn Sie wollen Schnellste zugreifen, müssen Sie zusätzlichen Speicher für eine hash-Tabelle.
Als Randbemerkung,
SortedList<TKey,TValue>
auch erlaubt effizienten Zugriff von int index, das ist schwer fürSortedDictionary<TKey,TValue>
, und praktisch bedeutungslos fürDictionary<TKey,TValue>
.Offensichtlich in Ihrem Szenario müssen Sie möglicherweise kombinieren
SortedList<,>
mit entweder verschachteln oder einen zusammengesetzten Schlüssel - aber IMO ist der beste Weg, um eine balance von Speicher-und accessor-Leistung. Sie könnten die Verwendung eines dedizierten composite-Schlüssel, D. H. eine iummutablestruct
mit den composite-Schlüssel-Mitglieder, überschreibenGetHashCode()
undEquals
, UmsetzungIEquatable<T>
, und für die Sortierung: UmsetzungIComparable
undIComparable<T>
.InformationsquelleAutor Marc Gravell
Sollten Sie nicht wählen, Ihre Daten-Struktur in Erster Linie durch die Erinnerung "footprint", sondern durch den Zugriff Muster: Was sind die häufigsten Suchvorgänge, die Sie wollen, wie oft die Struktur aktualisiert werden und so weiter.
Wenn Sie möchten füllen Sie die Struktur einmal und dann sehen die Autos durch zu machen und Bau-Jahr, der erste Ansatz scheint, die meisten vernünftigen (und gut lesbar/verständlich).
Btw, angesichts der Tatsache, dass mehrere Modelle können veröffentlicht werden, in einem Jahr, sollten Sie wahrscheinlich verwenden einen
Dictionary<string, Dictionary<string, List<string>>>
. Und ob es wirklich die Jahre, die Sie speichern möchten, sollten Sie nicht verwenden strings als Schlüssel, aberInt16
statt.InformationsquelleAutor MartinStettner
Können Sie eine
Dictionary
mitNameValueCollection
:Oder mit der Auflistung Initialisierungen:
Ich bin zwar kein Experte auf Speicherbedarf, IMHO diese bieten Ihnen den besten Zugang Muster in diesem speziellen Szenario.
InformationsquelleAutor Yogesh
Beim sprechen über access in Daten-Strukturen, es ist wichtig zu verstehen den Unterschied zwischen Lesen Zugang und schreiben Zugang. Wie für das Wörterbuch erhalten Sie
O(1)
Zugang zuvalue
durchkey
Zeit, aberO(log(n))
schreiben Sie mal, wenn ich mich nicht Irre. Ob mit reinen Listen, es ist immerO(1)
hinzufügen, aber es istO(n)
um auf Daten zuzugreifen. Wie für Speicher-footprint, ist es so ziemlich das gleiche:O(n)
im schlimmsten Fall.Wie viele Werte benötigen Sie, um zu speichern/aufrufen?
Entsprechend Ihrer code-Beispiele,
Option 1: unangemessen ist:
Schlüssel muss eindeutig sein, so
Option 2:
Dictionary<string, List<KeyValuePair<string, string>>>
ist das, was Sie brauchen.
O(1)
hinzufügen, vorausgesetzt, Sie fügen dem Ende; insert kann teuer werden für die array-basierte Listen (viel besser für verknüpfte Listen, offensichtlich)Re der footprint - wenn die OP das Ziel ist zu verringern Speicherbedarf, einen Flachbild
O(n)
mag wahr sein, aber nicht hilfreich; mit Implementierungen A und B, A nehmen könnte 5000-mal so viel Platz wie B, und immer noch beide wäreO(n)
ich habe bearbeitet meine post, fügte hinzu: "im schlimmsten Fall". Als für das schreiben Zeit, legen Sie nicht zu teuer sein, wenn Sie halten Letzte index, dann verwenden Sie einfach es. Natürlich sollten wir uns über die Umverteilung hier, aber es spielt keine Rolle, im Kontext der Frage 🙂
InformationsquelleAutor Ilya Smagin