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.
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
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn Sie versuchen, verwenden Sie sehr große Listen in 64 bit-Umgebungen, die Sie benötigen, um große Objekte in die Konfiguration der Anwendung.
http://msdn.microsoft.com/en-us/library/hh285054.aspx
Den OOM ist wahrscheinlich aufgrund der Art und Weise Listen/ArrayLists Speicher, die, wie ich glaube jedes mal, wenn Ihre Grenze erreicht ist, werden Sie versuchen, in Ihrer Größe verdoppeln. Die Liste kann nicht verdoppeln, von 2^24. Man könnte theoretisch maximieren Sie die Größe Ihrer Liste durch die Angabe einer Größe. (I. e. 2GB)
InformationsquelleAutor Steve Py
Habe ich geschrieben, was ich genau habe hier lohnt sich, es zu gehen.
Wieder Schritte sind:
Bewegen, um den nächsten Teil
und die gespeicherte Prozedur sollte so etwas wie dieses:
Ich werde auf jeden Fall arbeiten, egal wie viele Datensätze, die Sie haben, nur je mehr Daten Sie haben, länger dauert es fertig zu stellen.
InformationsquelleAutor CjCoax
Wenn es immer noch weniger als 2^24, wenn Sie manuell die richtige Liste Größe das ist dann wohl auf dem richtigen Weg. Anstatt sich auf 16 Millionen und dann versuchen zu verdoppeln die Größe der Liste, es werde die Liste wirklich groß, um mit zu beginnen und der Speicher früher.
Erklärt, warum Sie waren immer eine Runde Zahl - erreichte den 2^24 habe dann versucht, in der Größe erhöhen, die verursacht Sie verwenden zu viel Speicher.
Klingt für mich wie es ist eine Art 'Natürliche' Objekt-Größe begrenzen, im Gegensatz zu einem in der Umsetzung der Liste.
InformationsquelleAutor Jeff