2016-06-28 6 views
0

次のアプローチのどちらが良いでしょうか?ストリームをローカルにコピーしてクローズし、データを使用して行う必要がある操作を実行する方が良いでしょうか?ストリームを開いた状態で操作を実行するだけですか?ストリームからの入力が巨大であると仮定してください。streamreaderが開いているかストリームをローカルにコピー中に操作を実行し、ストリームを閉じて操作を実行しますか?

最初の方法:

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; 
} 

第二の方法:ファイルが頻繁に変更され

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

1つで十分なときに2つのループを実行するのはなぜですか? – Steve

+0

Linqを使って1行で記述することもできますが、パフォーマンスは単ループアプローチよりも良くないでしょう – Steve

答えて

0

場合は、内のデータを読み、それに取り組みます。頻繁にアクセスされない場合は、一度に1行ずつファイルを読み込んで、各行を個別に処理しても問題ありません。

0

一般に、1回のパスで実行できる場合は、1回のパスで実行します。入力が巨大であることを示しているので、すべてがメモリに収まるとは限りません。そうであれば、あなたの最初の選択肢は不可能です。

もちろん、すべての経験則には例外があります。しかし、ファイルやアクセスパターン(たとえば、アクセスしたい他のプロセス)に関して特別なことがあるとは示さず、データをコピーするために必要な時間よりも長く開いたままにしないでください。

あなたの例が現実のシナリオであるかどうか、または複雑な処理のためのプレースホルダとして単にサムを使用しているかどうかはわかりません。いずれのケースでは、ファイルの行ごとの処理をしている場合、あなたはFile.ReadLinesを使って、自分でトラブルを大幅に節約することができます

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

これは、一度にファイル全体をメモリに読み込みません。むしろ、列挙子を使用して一度に1行を表示し、比較的小さなバッファ(おそらく4キロバイト)を維持するために必要なだけの読み込みを行います。

関連する問題