-5

ファイルを操作するための次のアルゴリズムがあります。

//open ifstram to read each line

//open ofstream to output each line

while (getline(ifstream, line1)){

getline(ifstream, line2) ;
getline(ifstream, line3) ;  
getline(ifstream, line4) ;
//
getline(ifstream, line10) ;

for(int i = 1 ; i <= 10 ; i++)
// process line number i (some sort of character replacement, substring extraction)

output each line

}

ここで、コードを高速化するために、マルチスレッドを実行したいと思います。ただし、複数のスレッドを使用して上記のアルゴリズムを実行する方法が理解できないため、より高速で正しい出力が得られます。どんな提案も役に立ちます。

4

2 に答える 2

2
  1. マルチスレッドは必ずしもプログラムの高速化につながるとは限りません。
  2. これができるかどうかは、そこで行う処理の種類によって異なります。文字列ごとに実行され、以前の結果に依存しない場合は、C++11でstd::futureを使用できます。C ++ 11を使用したくない場合は、使用するものを指定してください。
  3. それがあなたがやろうとしていることであるならば、あなたはシリアルストリームから並列に複数のラインを導くことはできません。理由は明らかです。
于 2013-02-12T11:54:17.880 に答える
0

私があなたの質問を正しく理解していれば、あなたはストリームから読み込もうとしていて、読み込んだ素材をチャンクで処理しようとしています。

この例では、並列化の機会がいくつかあります。

  1. ファイルから読み取る場合、最初のチャンクを処理している間、OS はファイルの内容をバッファーに読み取り続けることができます。

  2. 読み取り元のソースが真に線形でない場合は、複数のストリームと複数のワーカーを作成し、それぞれが独自のチャンク セットで作業することができます。

  3. データのソースを制御できない場合、次の機会は、任意の数のワーカーを駆動するある種のキューに読み取りチャンクを配置する単一の I/O スレッドを用意することです。これは #2 に似ていますが、プロセス内で分割が発生します。これは、チャンク間の順序を保持する必要がある場合などに役立ちます。この場合、単一の出力ワーカーがキュー内のチャンクを再度収集し、到着時に並べ替えて出力します。

それらのどれが実際にあなたの状況に当てはまるかは、あなただけが決めることができます. また、必要な処理とスレッド化のオーバーヘッドに対する I/O の比率によっては、解決策 3 が考えられます。

  • 有害 (低い I/O および低い処理コストと比較して高いスレッド オーバーヘッド)
  • 単一のワーカーでのみ有用です (スレッド化のオーバーヘッドが低く、処理コストが I/O よりも低くなります。この場合、単一のワーカーは次のチャンクが読み取られる前に処理を終了します)
  • プラットフォームのコア数によって制限されます (スレッドのオーバーヘッドと I/O コストは低くなりますが、処理は高くなります。この場合、追加のワーカーはキャッシュなどの限られたリソースを求めて争うことになり、不要な非効率につながります)
于 2013-02-13T16:52:50.283 に答える