2016-03-24 9 views
0

サンプルコードがあります。ファイルの読み込み、処理、作成を高速化する方法は?

 foreach (var currentFile in currentDirectory) 
     { 
      string[] contents = File.ReadAllText(currentFile).Split('%'); 
      using (XmlWriter writer = XmlWriter.Create(currentFile.Replace(".txt",".xml"))) 
      { 
       writer.WriteStartDocument(); 
       writer.WriteStartElement("INFO"); 
       writer.WriteStartElement("INFO"); 
       writer.WriteElementString("USER", contents[1]); 
       writer.WriteElementString("USERDATA", contents[2]); 
       writer.WriteEndElement(); 
       writer.WriteEndElement(); 
       writer.WriteEndDocument(); 
      } 
     } 

私はそのようなテキストのテキストファイルを持っています:MYNICKNAME%たくさんのデータ。 今私はこのプログラムをマルチスレッド化しようとしています。どの方向に私は掘るべきですか?非同期/待機していますか?私はマルチスレッドにはまったく新しいものです。

+0

私たちはあなたがやろうとしているものに少しより多くの情報が必要になる場合があります。ディレクトリ内のすべてのファイルを1回だけ通過させ、各ファイルをテキストからxmlに変換するだけですか?考慮すべきことの1つは、あなたがこれらのファイルにアクセスする唯一のものかどうかです。 – CM0491

+0

並列処理は、CPU集約的な処理の一部にのみ有効です。あなたのプロセスの多くは並列処理の恩恵を受けないI/Oだと思われます。したがって、処理1と同じ時間に3つのファイルを処理することは現実的な目標ではありません。 –

+0

はい、ディレクトリにファイルを渡してから、処理してxmlファイルを作成します。したがって、ディレクトリ内の各テキストファイルにはxmlがあります。 Imはマルチスレッドで2-3倍の速さにしようとしています –

答えて

1

foreachParallel.ForEachに変更できます。

サンプル:How to: Write a Simple Parallel.ForEach Loop

、同様の質問:Read and process files in parallel C#

+1

Parallel.ForEachは、小さなファイルでは速くしません。それはファイルの大きなamoutでより良いです –

+0

マルチスレッドは、オーバーヘッドを追加するので、これは正常です。 'Luc Morin'がコメントしたように:あなたはディスクからファイルを読み込んでいます。したがって、あなたのスレッドは同じディスクから読み込むために競合しています。マルチスレッドは、自分の仕事の時間をあなたが持っているCPUの数で削減する、魔法のようなものではありません。他にも要因があります。 – Chris

+0

CPUを高速化する作業はありません。 –