2

大きなテキストファイルがあります..このファイルを読み込んで操作したい..

この操作は、各行で個別に行われます。基本的に、これを並行して実行できる関数を探しています。

void readFile(string filename){

  //do manipulation

}

つまり、操作は並行して行うことができます。

これは Hadoop を使用して簡単に実行できることに同意しましたが、それは過剰な解決策です。(ファイルは大きいですが、Hadoop が必要なほど大きくはありません...)

C++ でこれを行うにはどうすればよいですか?

4

3 に答える 3

6

そのためにmmapを使用します。mmap は、ファイルへのメモリのようなアクセスを提供するため、並列で簡単に読み取ることができます。mmap に関する別の stackoverflow トピックをご覧ください。mmap で非読み取り専用パターンを使用する場合は注意してください。

于 2013-06-21T21:00:13.690 に答える
3

この問題に直面し、それを解決しなければならない場合は、シングル スレッドのアプローチを使用するだけです。基盤となるメディアを高速化せずに多大な労力を費やす価値はありません。

これが RAM ディスク、または非常に高速な RAID などにあるとします。または、処理が何らかの形で大幅に偏っているとします。シナリオに関係なく、ライン処理に多くの時間がかかるようになりました。

ソリューションを次のように構成します。

class ThreadPool; // encapsulates a set of threads
class WorkUnitPool; // encapsulates a set of threadsafe work unit queues
class ReadableFile; // an interface to a file that can be read from

ThreadPool pool;
WorkUnitPool workunits;
ReadableFile file;

pool.Attach(workunits); // bind threads to (initially empty) work unit pool

file.Open("input.file")
while (!file.IsAtEOF()) workunits.Add(ReadLineFrom(file));

pool.Wait(); // wait for all of the threads to finish processing work units

私の「解決策」は、ニーズに適応できる利用可能なツールについて考えさせることを目的とした、一般的で高レベルの設計です。これを使用するには、慎重に検討する必要があります。これが私が望んでいることです。

他のスレッド操作と同様に、適切に設計するように細心の注意を払ってください。そうしないと、競合状態、データ破損、およびあらゆる種類の苦痛に遭遇します。これを行うスレッドプール/ワークユニットライブラリを見つけることができる場合は、必ずそれを使用してください。

于 2013-06-21T23:17:47.710 に答える
2

fread多くの行をバッファに読み込んでから、バッファを並行して操作するようなものを使用することをお勧めします。

http://www.cplusplus.com/reference/cstdio/fread/

一度に 1 ピクセル (int) ずつ画像を読み取り、ピクセルに変換してから、値をバッファーに書き込みました。大きなファイルの場合、1 分以上かかりました。代わりfreadに、最初にファイル全体をバッファーに読み取ってから、メモリ内のバッファーで変換を行うと、操作全体で1秒もかかりませんでした。これは、並列処理を使用しない場合の大幅な改善です。

ファイルが非常に大きいため、チャンクで読み取ることができます。チャンクを並行して操作してから、次のチャックで読み取ります。前のチャックを並行して (たとえば 7 つのスレッドで) 処理している間に、次のチャックを (1 つのスレッドで) 読み取ることもできますが、それが必要ではないことに気付くかもしれません。個人的には、OpenMP で並列処理を行います。

編集:freadファイルを読み込んでOpenMP openmpと並行して行を処理するために使用する回答を提供したことを忘れていました-テキストファイルの読み取りとパイプラインの使用のためのwhileループ おそらくそのコードを変更して何をするかは簡単でしょうあなたがしたい。

于 2013-06-21T20:46:44.790 に答える