Ich traf einen OutOfMemoryException-mit List<string> - ist das die Grenze, oder bin ich etwas fehlt?

Gelegenheit zu umschreiben, ich würde aber trotzdem den code so wie es da steht:

List<string> foobar;

Dann fügen wir eine Reihe von Zeichenfolgen zu foobar.

Bei count=16777216, schlagen wir eine out-of-memory-limit.

Mein Verständnis ist, dass jede saite wäre eine andere Größe. In der Tat, die Daten zu betrachten (nicht meine Daten), die meisten sind 2 oder 3 Zeichen.

was ist das maximale limit von Daten in Listen in c#? zeigt an, dass das max limit ist:

Die maximale Anzahl der Elemente, die gespeichert werden können in der aktuellen
Implementierung der Liste ist, theoretisch, Int32.MaxValue - nur
über 2 Milliarden.

Jedoch:

In der aktuellen Microsoft-Implementierung der CLR gibt es eine 2GB
maximale Objektgröße beschränken. (Es ist möglich, dass andere Implementierungen,
zum Beispiel Mono -, don ' T haben diese Einschränkung.)

In meinem Beispiel habe ich, was 16 Millionen Ergebnisse * ein paar bytes? Task-manager zeigt über ein Konzert verwendet, aber ich habe 8 GB RAM.

16777216 (2^24) scheint wie eine ziemlich spezifische Wert - verdächtig wie eine Grenze, aber ich finde keine Dokumentation überall zu a) das sichern oder b) finden Sie einen Weg um ihn herum?

Jede mögliche Hilfe würde geschätzt.


Code:

List<string> returnList = new List<string>();
SqlDataReader dr; // executes a read on a database, have removed that part as that bit works fine

  if (dr.HasRows)
  {
      while (dr.Read())
      {
          returnList.Add(dr.GetString(0).Trim());
      }
  }

Das ist die vereinfachte form, ich habe jetzt einige try/catch für die OOM-Ausnahme, aber dies ist der eigentliche code, der mir Kummer.

Können Sie uns zeigen, Ihren code?
Heap-Größe ist unterschiedlich von der RAM-Größe, ein Teil des RAM wird als heap wird verwendet, um Objekte zu speichern. stackoverflow.com/questions/2325370/...
Ich bin das hinzufügen von 21 Millionen, wirklich :/ Es ist eine Daten-migration, und die wurde genutzt für eine kleine migration und jetzt bugsiert arbeiten mit viel größeren Datensatz.
Ich habe etwas getan, wie das manchmal der Rücken, es war ein SSIS-Paket und war den Umgang mit einer großen Menge von Daten, wie Sie tun! Was ich Tat, war zu erstellen Sie eine gespeicherte Prozedur auf meinem Tisch(mit Millionen von Datensätzen), und zu jeder Zeit abgerufen 1000 Datensätze, übertragen Sie Sie über,veröffentlicht die Liste und bewegen Sie auf die nächste Los.
Ich würde die Initialisierung der Liste mit der richtigen Größe, zum Beispiel durch die Verwendung von select count(*) from TableName ersten und der Konstruktor. Dann würden Sie vermeiden die Verdoppelung Algorithmus verwendet, um die Größe der backing-Puffer List.Add.

InformationsquelleAutor Mark Mayo | 2012-11-22

Schreibe einen Kommentar