ich auf diesem Befehl bin immerFehler bei der Definition Zahl ist größer als 89.478.457
Dictionary<UInt64, int> myIntDict = new Dictionary<UInt64, int>(89478458);
diesen Fehler:
System.OutOfMemoryException was unhandled HResult=-2147024882
Message=Array dimensions exceeded supported range.
Source=mscorlib
StackTrace:
at System.Collections.Generic.Dictionary`2.Initialize(Int32 capacity)
at System.Collections.Generic.Dictionary`2..ctor(Int32 capacity, IEqualityComparer`1 comparer)
Auf 89.478.457 gibt es keine Fehler. Hier ist die Quelle der Initialisierung in Dictionary.cs:
private void Initialize(int capacity)
{
int size = HashHelpers.GetPrime(capacity);
...
entries = new Entry[size];
...
}
Wenn ich dies zu reproduzieren, passiert der Fehler auf der Array-Erstellung. Eintrag ist eine Struktur in diesem Fall mit der Größe 24. Wenn wir max Int32 (0x80000000-1) bekommen und dividieren auf 24 = 89478485 und diese Zahl ist zwischen den Primzahlen 89478457 und 89478503.
Bedeutet dies, dass Array von struct kann nicht größer sein als maxInt32/sizeOfThisStruct?
BEARBEITEN:
Ja. Ich gehe tatsächlich über 2 GB. Dies passiert, wenn das Dictionary das interne Array von struct Entry erstellt, wo die Paare (Schlüssel, Wert) gespeichert sind. In meinem Fall ist die Größe von (Entry) 24 Bytes und als Werttyp ist inline zugeordnet.
Und die Lösung ist die gcAllowVeryLargeObjects Flagge (danke Evk). Eigentlich in .net Kern ist die Flagge the environment variable COMPLUS_gcAllowVeryLargeObjects (danke svick).
Und ja, Paparazzi ist richtig. Ich muss darüber nachdenken, wie ich meine Erinnerung nicht verschwenden soll. Danke euch allen.
Ich frage mich, warum Sie dictionary müssen, dass in der Größe groß?Die wirkliche Praktikabilität dieser Tortur ist, was ich in Frage stelle –
@BenPhilipp Int ist nur für den Test. Eigentlich ist eine Struktur. – Mottor
@MukeshAdhvaryu Was verwenden Sie für spärliche 3D-Array. – Mottor