2017-02-15 2 views
-1

Ich habe einen Code in C# entwickelt, der Daten aus der CSV-Datei in eine Datentabelle kopiert. Die CSV-Datei enthält 5 Millionen Zeilen und ich lese Zeile für Zeile die Zeilen, um Speicherprobleme zu vermeiden. Ich frage mich, warum ich immer noch OutOfMemory Exception bekomme. Ich habe breakPoints hinzugefügt, um sicherzustellen, dass die richtigen Strings in meine Variablen kopiert werden und sie korrekt funktionieren. Irgendwelche Ideen?'System.OutOfMemoryException' beim Kopieren von CSV-Datei in Datentabelle

int first_row_flag = 0; //first row is column name and we dont need to import them 
string temp;     
foreach (var row in File.ReadLines(path3)) 
{ 
    if (!string.IsNullOrEmpty(row)) 
    { 
     int i = 0; 
     if (first_row_flag != 0) 
     { 
      dt.Rows.Add(); 
      foreach (string cell in row.Split(',')) 
      { 

       if (i < 9) 
       { 
        temp = cell.Replace("\n", ""); 
        temp = temp.Replace("\r", ""); 
        dt.Rows[dt.Rows.Count - 1][i] = temp; 
        i++; 
       } 
      } 
     } 
     else 
     { 
      first_row_flag++; //get rid of first row 
     } 
    } 
} 

Die Anzahl der Spalten in jeder Zeile ist 9. Das ist, warum ich i verwenden, um sicherzustellen, dass ich nicht unerwartete Daten in der 10. Spalte lesen. Hier

ist der Stack-Trace:

enter image description here

+5

Sie laden alle diese Daten gleichzeitig in eine DataTable? Scheint so, als würde das eine Menge Speicher verbrauchen .... – mason

+3

du fügst immer noch hinzu und fügst und fügst einer (ich vermute) Datentabelle hinzu. – Kritner

+3

Wie genau hilft das Lesen Zeile für Zeile hier, wenn Sie noch alle Zeilen im Speicher halten? – decPL

Antwort

2

5 Millionen Zeilen, könnte zu viel Daten zu handhaben sein. (hängt von der Anzahl der Spalten und Werte ab). Überprüfen Sie die Dateigröße und vergleichen Sie sie mit dem für eine grobe Idee verfügbaren Speicher. Der Punkt ist, mit so vielen Daten, dass Sie am Ende mit Ausnahme von Speicher mit anderen Techniken die meiste Zeit enden.

Sie sollten die Verwendung von DataTable, zu überdenken, wenn Sie Datensätze zu halten, so dass Sie später einen Einsatz in DB tun können, dann Prozess Ihre Daten in kleinen Chargen.

Wenn Sie sich entscheiden, Daten in Stapeln zu behandeln, dann könnten Sie sogar daran denken, DataTable überhaupt nicht zu verwenden, stattdessen List<T> verwenden.

Siehe auch andere Techniken zum Lesen von CSV-Datei. Reading CSV files using C#

+0

Randnotiz: Sie wissen "Anzahl der Spalten und Werte" - alle Zeilen außer höchstens 9 sind leer ... :) –

Verwandte Themen