OutOfMemoryException beim hinzufügen weitere Elemente, um eine sehr große HashSet<Int32>
Ausnahme des Typs System.OutOfMemoryException
geworfen wurde, während Sie versuchen, um 23997908th
Element in einem HashSet<Int32>
.
Brauchen wir pflegen eine hohe performance und einzigartige Sammlung von integer sizeof Int32
.MaxValue d.h. 2147483647
. HashSet
der Int32
speichern können nur 23997907
Elemente in es. Suche für einen Vorschlag um dieses Problem zu beheben.
Nur aus reiner Neugier: was brauchen Sie für diese?
blog.mischel.com/2008/04/09/hashset-limitations
Wie bereits erwähnt in der post, benötigen wir pflegen eine hohe performance und einzigartige Sammlung von integer, gerecht einige unserer Anforderung
eine einfache WPF-basierten WindowsApplication
blog.mischel.com/2008/04/09/hashset-limitations
Wie bereits erwähnt in der post, benötigen wir pflegen eine hohe performance und einzigartige Sammlung von integer, gerecht einige unserer Anforderung
eine einfache WPF-basierten WindowsApplication
InformationsquelleAutor Debasis | 2011-12-27
Du musst angemeldet sein, um einen Kommentar abzugeben.
Kapazität eines HashSet(Of T) - Objekt ist die Anzahl der Elemente, die das Objekt halten kann. Objekt die Kapazität erhöht sich automatisch als Elemente Hinzugefügt werden.
Aktivieren Sie diese Einstellungen aus der config-Datei,
Überprüfen Sie diese MSDN link für die Einstellung der Konfiguration.
Update:
Ich bin plötzlich viel mehr begeistert .NET 4.5. Ich habe traf in der 2 GB-Grenze viel zu viele Male.
ja, ich vergaß zu erwähnen. die Aktualisierung meiner Antwort. Dank
Über config gcAllowVeryLargeObjects unterstützt .Net framework 4.5 nur. Warum habe ich nicht Lesen Sie diese Zeile.... warum ....
InformationsquelleAutor mehul9595
HashSet
wächst um das doppelte. Also, wenn Sie 23,997,907 Elemente in der Liste und versuchen Sie, fügen Sie die nächste, versucht er es auf die doppelte Größe seiner backing-array. Und dass die Zuordnung bewirkt, dass es zu überschreiten den verfügbaren Speicher. Ich nehme an, man läuft dieser auf einem 32-bit-system, da auf einem 64-bit-system eineHashSet<object>
halten kann nach oben von 89 Millionen Artikel. Die Grenze ist etwa 61.7 Millionen Elemente in der 32-bit-Laufzeit.Was Sie tun müssen, ist die pre-Allokation der
HashSet
zu halten, wie viele Elemente, wie Sie benötigen. Leider gibt es keine direkte Weg, das zu tun.HashSet
nicht über einen Konstruktor verfügen, werden vor dem zuweisen mit einer gegebenen Kapazität.Können Sie, jedoch, erstellen Sie eine
List
verwenden Sie zur Initialisierung derHashSet
, und rufen Sie dannClear
auf dieHashSet
. Dass am Ende geben Sie eineHashSet
dass keine Gegenstände in ihm, sondern einer Kapazität von max, die Sie beantragt. Ich zeigte, wie man das in einem blog-post: Mehr auf .NET Collection-Größen.Die Grenzen auf
HashSet
Größe sind aufgrund der zwei gigabyte-Grenze .NET. Kein einzelnes Objekt kann größer als zwei Gigabyte. Die Zahl ist tatsächlich etwas kleiner, aufgrund der Verteilung overhead.Wenn Sie in 64-bit-Modus, würde ich erwarten, dass ein
List<int>
geben Sie mehr als 500 Millionen Einträge. Ihre 134 Millionen Elementen arbeitet, mehr als 512 Megabyte Speicher, die könnte einfach mehr sein, als Sie zuteilen können in der 32-bit-Laufzeit. 134 Millionen ist ziemlich in der Nähe des größtenHashSet
können Sie bauen, auch in 64-bit-Modus.InformationsquelleAutor Jim Mischel
Dieses problem zu umgehen, habe ich eine Klasse HashSet implementiert die Methoden und Eigenschaften (Enthält, Add, Count, ...) und hinter den kulissen hält eine Reihe von HashSets zum speichern der tatsächlichen Daten. Die erste Umsetzung nur ausgereizt jeder HashSet one-by-one und zog in die nächste im array, wenn Sie voll. Die Letzte nimmt ein mod der die hash-Schlüssel wie der index auf die interne HashSet array. Dies funktioniert gut für mich, denn die Tasten sind ziemlich random, so dass die Verteilung der Werte auf die HashSets array ist ziemlich sogar.
InformationsquelleAutor BrianS
In diesem Punkt, denke ich, würden Sie brauchen, um eine Datenbank zu persistieren Ihre Produkte (oder deren hash-Schlüssel), da dies zu viele Elemente zu speichern in den Standard .NET-Objekte. Man könnte auch schreiben, ein benutzerdefiniertes Objekt, das die gleichen Eigenschaften wie ein HashSet, aber das wäre mehr ein Problem, dass nur mit Hilfe einer Datenbank-Tabelle zum speichern der hashes.
InformationsquelleAutor SqlRyan