2016-06-28 12 views
0

Welcher der folgenden Ansätze ist besser? Ich wollte fragen, ist es besser, den Stream lokal zu kopieren, ihn zu schließen und alle Operationen auszuführen, die mit den Daten ausgeführt werden müssen? oder einfach Operationen mit offenem Stream ausführen? Angenommen, die Eingabe aus dem Stream ist riesig.Führen Sie Vorgänge aus, während der Streamreader geöffnet ist, oder kopieren Sie den Stream lokal, schließen Sie den Stream und führen Sie dann Vorgänge aus?

Erste Methode:

public static int calculateSum(string filePath) 
{    
    int sum = 0; 
    var list = new List<int>(); 

     using (StreamReader sr = new StreamReader(filePath)) 
     { 
      while (!sr.EndOfStream) 
      { 
       list.Add(int.Parse(sr.ReadLine())); 
      } 
     } 

    foreach(int item in list) 
     sum += item; 
    return sum; 
} 

Zweite Methode:

public static int calculateSum(string filePath) 
{    
    int sum = 0; 

     using (StreamReader sr = new StreamReader(filePath)) 
     { 
      while (!sr.EndOfStream) 
      { 
       sum += int.Parse(sr.ReadLine()); 
      } 
     } 

    return sum; 
} 
+0

Warum möchten Sie zwei Schleifen ausführen, wenn eines ausreicht? – Steve

+0

Es könnte in einer einzigen Zeile mit Linq geschrieben werden, aber wahrscheinlich sind die Leistung nicht besser als die Single-Loop-Ansatz – Steve

Antwort

0

Wenn die Datei häufig geändert wird, dann lesen Sie die Daten in und dann mit ihm arbeiten. Wenn Sie nicht häufig darauf zugreifen, können Sie die Datei Zeile für Zeile lesen und mit jeder Zeile separat arbeiten.

0

Im Allgemeinen, wenn Sie es in einem einzigen Durchgang tun können, dann tun Sie es in einem einzigen Durchgang. Sie geben an, dass die Eingabe sehr groß ist, sodass nicht alle in den Speicher passen. Wenn das der Fall ist, ist Ihre erste Option nicht einmal möglich.

Natürlich gibt es Ausnahmen zu jeder Faustregel. Sie geben jedoch nicht an, dass die Datei oder das Zugriffsmuster (z. B. andere Prozesse, die darauf zugreifen möchten) etwas Spezielles enthält, das Sie daran hindert, länger als unbedingt notwendig geöffnet zu bleiben, um die Daten zu kopieren.

Ich weiß nicht, ob Ihr Beispiel ein Real-World-Szenario ist oder wenn Sie nur die Summe als Platzhalter für komplexere Verarbeitung verwenden. Auf jeden Fall, wenn Sie eine Datei line-by-line sind die Verarbeitung, können Sie sich eine Menge Ärger sparen File.ReadLines unter Verwendung:

int sum = 0; 
foreach (var line in File.ReadLines(filePath)) 
{ 
    sum += int.Parse(line); 
} 

Dies ist nicht die gesamte Datei in den Speicher auf einmal liest. Stattdessen verwendet es einen Enumerator, um jeweils eine Zeile zu präsentieren, und liest nur so viel wie nötig, um einen relativ kleinen (wahrscheinlich vier Kilobyte) Puffer zu erhalten.