Sind .NET-Sammlungen mit einer großen Anzahl von Elementen in der LOH gespeichert?.NET-Sammlungen und der Large Object Heap (LOH)
Ich bin neugierig auf List und Wörterbuch speziell. In meinem Code speichere ich eine große Anzahl (40k +) relativ kleiner Objekte (etwa 1k) in temporären Listen und Dictionarys zur Verarbeitung. Erhöht die Anzahl der Artikel in diesen Sammlungen die Wahrscheinlichkeit, dass sie in die LOH aufgenommen werden?
Für Liste, vorausgesetzt, dass Liste als doppelt verknüpfte Liste implementiert ist, dann sollte die Anzahl der Elemente nicht die Größe des tatsächlichen List-Objekts erhöhen, aber ich würde gerne sicher wissen.
Dank
Arrays verdoppelt haben eine untere Grenze, da sie schneller sind, wenn sie auf 8 Byte bounders verbündet, (ebenfalls von List wie es verwendet ein Array) –
Die Implementierung von Dictionary ist als verschmolzenen hashtable (Verkettungs, aber unter Verwendung eines Arrays um die verketteten Buckets zu speichern, um so einige Vorteile der offenen Adressierung zu erhalten, so wie es der Cache-Gebrauch tut), so enthalten sie mit 40k ein internes Array von 40000 * (Keysize + valuesize + 8 [ein Int zum Speichern des Hashcodes und eine, um den nächsten Index in der Kette zu speichern]] und ein internes Array von 40000 * 4 (int-Größe). Das 40000 wird tatsächlich mindestens 43627 sein, vielleicht so viel wie 90523, abhängig von der gewachsenen Geschichte, da es vorberechnete Primzahlen verwendet. Als solches wird es definitiv ... –
... mindestens ein 436270-Byte-Array (wenn Schlüssel und Wert beide Byte-Größe, mehr für jede andere Größe) und mindestens ein 174508-Byte-Array von Indizes sein .Daher würde ein 40k-Element-Wörterbuch ** immer ** einige seiner internen Repräsentationen in der LOH haben (das Wörterbuch selbst ist eher wie 40-80 Bytes und in einer der Generationenhaufen, egal welche Größe). –