2016-07-01 9 views
-1

Googleでいくつかの例を検索しましたが、必要なものを実際に見つけることができませんでした。C#Parallel/Multithread a while

私は、このwhileループがありますので、

StreamReader ImportFile = new StreamReader(@"c:\users\matthew\desktop\test.txt"); 

string line; 
while ((line = ImportFile.ReadLine()) != null) 
{ 
    doneTotal++; 

    string[] info = line.Split('-'); 
    string username = info.Length >= 1 ? info[0] : null; 
    string file = info.Length >= 2 ? info[1] : null; 

    myfunc(username, file); 
} 

を、myfunc関数は速いが、私のために十分に高速ではありません。ループ中に並列またはマルチスレッドを実行するにはどうすればよいですか?

ありがとうございました。

+2

あなたのプロセスが遅いのはI/Oだとはっきりしています。パフォーマンスを向上させるためにI/Oをマルチスレッド化することはできません。ファイル全体を1つの文字列として読み込み、各行を別々に処理します。 – Gus

+0

あなたはすべての行を読み取ってから、並列foreachでそれらを反復できませんでしたか? –

+0

@Gus&Steven私が使用するファイルは、オープンには大きすぎることがあるので、大きなファイルを開く別の方法がない限り、これを使用しなければならないと思いますか? – wtm

答えて

1

これを試してみてください。まず、myfuncのパラメータセットを表す新しいクラスを追加します。 (それはTuple<string, string>でもあるかもしれない)。その後

public class MyFuncParameters 
{ 
    public string UserName { get; set; } 
    public string File { get; set; } 
} 

このようなあなたのオリジナルの方法を変更します。あなたは、ファイルの別のリストを反復している場合は、最初の(作成した後、一つのファイルから必要なすべてを読み、そして、言い換えれば

StreamReader ImportFile = new StreamReader(@"c:\users\matthew\desktop\test.txt"); 

string line; 
var filesToProcess = new List<MyFuncParameters>(); 
while ((line = ImportFile.ReadLine()) != null) 
{ 
    doneTotal++; 

    string[] info = line.Split('-'); 
    string username = info.Length >= 1 ? info[0] : null; 
    string file = info.Length >= 2 ? info[1] : null; 

    filesToProcess.Add(new MyFuncParameters {File = file, UserName = username}); 
} 

foreach (var fileToProcess in filesToProcess) 
{ 
    myfunc(fileToProcess.UserName, fileToProcess.File); 
} 

元のファイルから)を次に行います。 1つのファイルを読まずに、別のファイルを読み込みの間に元のファイルに書き込むことで、何らかの処理(myfunc)を実行すると、パフォーマンスが向上する場合があります。

これは推測です。それはあなたがそれが遅い部分であることを示して以来、正確にmyfuncが何をするかによって決まるでしょう。

コメントに記載されているように、必要なだけ多くの並列スレッドを起動してファイルを読み取ることができますが、そのうちの1つだけがディスクから実際に読み取ることができます。それはそれをより遅くすることさえできる。

0

私はこれを私の他の答えに掲載したと思ったが、私はそれを見ない。

サーバーに投稿する内容を変更して、1つのユーザー名と1つのファイル名で多数のリクエストを送信する代わりに、代わりにコレクションを投稿できますか? 1つ(または複数)の大きなリクエストは、多くの小さなリクエストよりもずっと速くなります。各アイテムの処理には同じ時間がかかりますが、すべての個別のコールを作成するオーバーヘッドは取り除きます。