Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
Dictionary wird Exception beim Einfügen vielen Datensätze
Christoph K.
myCSharp.de - Member

Avatar #avatar-3248.png


Dabei seit:
Beiträge: 800
Herkunft: Köln

Themenstarter:

Dictionary wird Exception beim Einfügen vielen Datensätze

beantworten | zitieren | melden

Hallo,

ich habe folgenden Code zum Befüllen eines Dictionarys.
Wenn das 95991738 Element eingefügt wird, die Exception "Die Arraydimensionen haben den unterstützten Bereich überschritten." geworfen.
Kann sich das jemand erklären?

            var test = new Dictionary<int, int>();

            var count = 0;
            while (true)
            {
                test.Add(count++, 1);
            }
private Nachricht | Beiträge des Benutzers
Alf Ator
myCSharp.de - Member



Dabei seit:
Beiträge: 646

beantworten | zitieren | melden

Sieht für mich nach einer OutOfMemoryException aus.
private Nachricht | Beiträge des Benutzers
Christoph K.
myCSharp.de - Member

Avatar #avatar-3248.png


Dabei seit:
Beiträge: 800
Herkunft: Köln

Themenstarter:

beantworten | zitieren | melden

Warum sollte die auftreten?
Es ist eine 64 Bit Applikation und auf dem Computer ist noch genügend freien RAM vorhanden.
private Nachricht | Beiträge des Benutzers
dannoe
myCSharp.de - Member



Dabei seit:
Beiträge: 210

beantworten | zitieren | melden

Verwendest du .NET Framework? Maximale Objektgröße ist dort standardmäßig (auch in 64 Bit) 2 GB

Versuch mal in der app.config:

<configuration>
  <runtime>
    <gcAllowVeryLargeObjects enabled = "true" />
  </runtime>
</configuration>
private Nachricht | Beiträge des Benutzers
Alf Ator
myCSharp.de - Member



Dabei seit:
Beiträge: 646

beantworten | zitieren | melden

Ich habe kurz nachgelesen. Der Heap bei 32-Bit-Applikationen scheint eine maximale Größe von ~1,5 GB zu haben. Das würde zu den 95991738 Elementen passen.

Aber ehrlich gesagt, weiß ich es nicht. Vielleicht kann einer von unseren Profis hier die Frage beantworten.

[Edit]
Ich habe es mal ausprobiert, wenn ich die App auf x86 stelle, kommt die Exception nach 23997908 Elementen. Mit x64 bei 95991738 Elementen.
Dieser Beitrag wurde 2 mal editiert, zum letzten Mal von Alf Ator am .
private Nachricht | Beiträge des Benutzers
gfoidl
myCSharp.de - Team

Avatar #avatar-2894.jpg


Dabei seit:
Beiträge: 6.814
Herkunft: Waidring

beantworten | zitieren | melden

Hallo Christoph K. ,
Zitat
die Exception "Die Arraydimensionen haben den unterstützten Bereich überschritten."
Die Exception hat auch einen Typ. Schau dir den an, so weißt du worum es geht.
Also ob es OutOfMemory, IndexOutOfRange, etc. ist. Der Text alleine ist schön, aber für eine Diagnose ist der Typ wichtiger.
Zitat
auf dem Computer ist noch genügend freien RAM vorhanden.
Bei der OutOfMemoryException geht es v.a. darum ob der GC einen zusammenhängenden Speicherbereich verwenden / finden / vom OS verlangen kann, der groß genug ist um das Objekt (hier beim Dictionary ein internen Array) halten zu können. Ist das nicht der Fall -> OOM.

mfG Gü

Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"
private Nachricht | Beiträge des Benutzers
Abt
myCSharp.de - Team

Avatar #avatar-4119.png


Dabei seit:
Beiträge: 15.757

beantworten | zitieren | melden

Zitat von gfoidl
Bei der OutOfMemoryException geht es v.a. darum ob der GC einen zusammenhängenden Speicherbereich verwenden[...]
.. oder das System nicht mehr genug Handles zur Verfügung hat.
Man sollte daher schon wissen, was OutOfMemoryException einfach bedeutet: weit mehr als nur "out of memory".

Und noch besser isses natürlich potentiellen Helfern einfach zu sagen, welche Exception geworfen wird.
Dann muss niemand raten, weil Glaskugeln haben wir leider noch nicht.
[Hinweis] Wie poste ich richtig? 5. Problem genau beschreiben - inkl. genauer Fehlermeldung

Liegt aber nahe, dass es sich um eine OutOfMemoryException handelt.
Bestätigt das bitte.
private Nachricht | Beiträge des Benutzers
T-Virus
myCSharp.de - Member



Dabei seit:
Beiträge: 1.962
Herkunft: Nordhausen, Nörten-Hardenberg

beantworten | zitieren | melden

Meine Frage wäre auch welchen Sinn dieser Code hat.
Du hast hier eine while(true) Schleife was so oder so zu einem endlosen Durchlauf führt und früher oder später zu einem Überlauf oder OutOfMemory Exception.
Etwas mehr Context zu deinem Vorhanden könnte ggf. auch zu einer sinnvolleren Lösung führen.

T-Virus
Developer, Developer, Developer, Developer....

99 little bugs in the code, 99 little bugs. Take one down, patch it around, 117 little bugs in the code.
private Nachricht | Beiträge des Benutzers
Christoph K.
myCSharp.de - Member

Avatar #avatar-3248.png


Dabei seit:
Beiträge: 800
Herkunft: Köln

Themenstarter:

beantworten | zitieren | melden

Es handelt sich um eine OutOfMemoryException

@T-Virus: Es handelt sich um die Abstraktion eines realen Problems. Es geht im Endeffekt darum, das ein RAM-Cache benötigt wird, der entsprechend viele Objekte in einem Dictionary beinhalten soll.
private Nachricht | Beiträge des Benutzers
T-Virus
myCSharp.de - Member



Dabei seit:
Beiträge: 1.962
Herkunft: Nordhausen, Nörten-Hardenberg

beantworten | zitieren | melden

@Christoph K.
Welches reale Problem wäre dies den, wenn ich fragen darf.
Sieht dein Code im produktiv System genauso aus, dann kann es nicht funktionieren.
Wäre es hier nicht sinnvoll nur benötigte Daten direkt im Cache abzulegen anstatt Unmengen an Einträgen zu generieren?
Dies wäre für sich gegeben schon ein Dictionary mit eindeutigen Keys.

Einträge sollten nur abgelegt/eingefügt werden, wenn diese benötigt werden sonst läufst du eben auf das Speicherproblem.
Ggf. wäre auch die Einbindung von Redis als Cacheserver sinnvoll um nahezu endlose Daten zu speichern.
Nutzen wir auch um größere verteilte Caches zu nutzen.

T-Virus
Developer, Developer, Developer, Developer....

99 little bugs in the code, 99 little bugs. Take one down, patch it around, 117 little bugs in the code.
private Nachricht | Beiträge des Benutzers
gfoidl
myCSharp.de - Team

Avatar #avatar-2894.jpg


Dabei seit:
Beiträge: 6.814
Herkunft: Waidring

beantworten | zitieren | melden

Hallo Christoph K. ,
Zitat
ein RAM-Cache benötigt wird, der entsprechend viele Objekte in einem Dictionary beinhalten soll.
Ist Cache in-memory ein Möglichkeit?
Das wären .NET-Bordmittel und genau für solche Szenarien getrimmt.

mfG Gü

Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"
private Nachricht | Beiträge des Benutzers
T-Virus
myCSharp.de - Member



Dabei seit:
Beiträge: 1.962
Herkunft: Nordhausen, Nörten-Hardenberg

beantworten | zitieren | melden

Zusätzlich dazu, kannst du auch Redis einbinden.
Wenn du nur einen Prozess hast, kannst du die Daten einfach lokal vorhalten und in Redis speichern/updaten.
Damit könntest du nahe zu endlose Datenmengen wegspeichern.
Durch Pub/Sub kannst du dann auch bei verteilten Anwendungen die Caches updaten lassen.

T-Virus
Developer, Developer, Developer, Developer....

99 little bugs in the code, 99 little bugs. Take one down, patch it around, 117 little bugs in the code.
private Nachricht | Beiträge des Benutzers