Ich verwende string.split () in meinem C # -Code zum Lesen der Tab-separierten Datei. Ich stehe vor "OutOfMemory-Ausnahme", wie unten im Codebeispiel erwähnt.
Hier würde ich gerne wissen, warum das Problem für eine Datei mit der Größe 16 MB kommt?
Das ist richtige Annäherung oder nicht?
%Vor%Split ist schlecht implementiert und weist schwerwiegende Leistungsprobleme auf, wenn es auf große Strings angewendet wird. In finden Sie in diesem Artikel weitere Informationen zu Speicheranforderungen durch Split-Funktion :
Was passiert, wenn Sie eine Teilung für eine Zeichenkette durchführen, die 1355049 kommagetrennte Zeichenketten mit jeweils 16 Zeichen enthält, die eine Gesamtlänge von 25745930 haben?
Ein Array von Zeigern auf String-Objekt: Zusammenhängender virtueller Adressraum von 4 (Adresszeiger) * 1355049 = 5420196 (Array-Größe) + 16 (für Buchhaltung) = 5420212.
Nicht zusammenhängender virtueller Adressraum für 1355049-Strings mit jeweils 54 Byte. Es bedeutet nicht, dass all diese 1,3 Millionen Strings über den gesamten Heap verstreut sind, aber sie werden nicht auf LOH verteilt. GC wird sie auf Bündeln auf dem Gen0-Haufen verteilen.
Split.Function wird ein internes Array von System.Int32 [] der Größe 25745930 erzeugen, das (102983736 Bytes) ~ 98MB LOH verbraucht, was sehr teuer L ist.
Versuchen Sie, die Datei zeilenweise zu lesen, anstatt den gesamten Inhalt zu teilen.
Tags und Links c# out-of-memory