string.split () "Out of memory exception" beim Lesen der Tab-separierten Datei

8

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%     
Hemant Kothiyal 10.09.2009, 10:12
quelle

5 Antworten

12

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?

     
  1. Ein Array von Zeigern auf String-Objekt: Zusammenhängender virtueller Adressraum von 4 (Adresszeiger) * 1355049 = 5420196 (Array-Größe) + 16 (für Buchhaltung) = 5420212.

  2.   
  3. 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.

  4.   
  5. 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.

  6.   
    
Vipin Kumar 01.04.2011, 18:01
quelle
10

Versuchen Sie, nicht die gesamte Datei zuerst in ein Array zu lesen. "reader.ReadToEnd ()" Lesen Sie die Datei Zeile für Zeile direkt ..

%Vor%     
bleeeah 10.09.2009 10:22
quelle
4

Ich würde empfehlen, Zeile für Zeile zu lesen, wenn Sie können, aber manchmal ist das Teilen durch neue Zeilen nicht die Voraussetzung.

Sie können also immer Ihre eigene speichereffiziente Aufteilung schreiben. Das hat das Problem für mich gelöst.

%Vor%     
weston 12.11.2012 11:30
quelle
2

Ich benutze meine eigenen. Es wurde mit 10 Unit Tests getestet.

%Vor%     
thomas nn 19.02.2015 08:41
quelle
1

Versuchen Sie, die Datei zeilenweise zu lesen, anstatt den gesamten Inhalt zu teilen.

    
Scoregraphic 10.09.2009 10:16
quelle

Tags und Links