2016-08-16 3 views
0

私は、ディスクにできるだけ並行して書き込みたいいくつかのファイルを含むメインメモリにバッファを持っています。毎回異なる場所に読み書きします。 C++でディスクに書き込んでいるプログラムでどのように並列性を達成できますか?

この

は私のコードです:

#include <thread> 
void t1(){//read from the buffer and writes the 1st file to the disk } 
void t2(){//same with the second one } 
void t3(){//3rd} 
void t4(){//4th} 

int main(){ 
    std::thread thread1(t1); 
    std::thread thread2(t2); 
    std::thread thread3(t3); 
    std::thread thread4(t4); 

    t1.join(); 
    t2.join(); 
    t3.join(); 
    t4.join(); 
} 

私は並行して、バッファの読み取りを行うことができますことを知っているが、書き込みがボトルネックとなっています。ディスクへの書き込みを並列化する方法はありますか?より良いパフォーマンスを得るためにできることは他にありますか?

ありがとう

EDIT:すべてのスレッドが別のファイルに書き込みます。

+0

OSは直接I/Oを実行していないので、OSはこれらの書き込みを最適化するようにチューニングして並べ替えます。これを改善するためにコードが多くなりません(パラレル同じファイルへの読み取り/書き込み)。 SSDディスクを使用するか、RAIDでディスクを設定しますか? – nos

+0

回答を編集して、a)すべてのスレッドが同じファイルまたは別のファイルに書き込んでいるかどうかを指定してください。 b)もしそれらが同じファイルに書いているのであれば、各スレッドは書いているファイルのそれ自身の "領域"を持っていますか? –

+0

@nosすでにSSDディスクを使用しています。したがって、異なるコアの異なるスレッドから同時にディスクに書き込む方法はありませんか? – mata

答えて

2

これは、書き込みたいデータによって大きく異なります。

固定サイズのデータ​​を書き込むと、4つのチャンクに分割でき、各スレッドはファイル内の特定の位置を探して書き込みます。スレッドごとに1つずつ、4つの異なるファイルストリームオブジェクトが必要であることに注意してください。

任意のテキストと同様に固定サイズのデータ​​を書き込むことは、並行して行うことはできません。これには何らかの種類の同期が必要なので、一度に1つのスレッドしか書き込みません。

また、データが固定サイズであっても、データがストリーミングであり、チャンクに分割できない場合、パラレルに書き込むことができない場合があります。あなたはすべてのスレッドが同じファイルに書き込みたい場合は


以上です。スレッドがそれぞれ異なるファイルに書き込む場合、問題はありません。これは、複数のプロセスが異なるファイルに書き込むことと同じです。

+0

@mataあなたのコンピュータには、このインスタンスと並行して複数のプログラムが実行されており、その中にはこのテキストを読むときにディスクに書き込んでいるものがあります。それぞれが自分のファイルを開いてそれらに書き込む4つの異なるスレッドを持つことも同じです。これは、使用しているオペレーティングシステムの一部が処理するように設計されたものです。 –

+0

私は何か他のことをする必要がありますか?上で書いたコードは、すでに並列で書き込みをしていますか?そして、Visual Studio Community 2015では、1つのスレッドを実行するのにかかる時間と、プログラム全体を実行するのにかかる時間をどのように測定できますか? – mata

+0

@mata各スレッドでファイルを開いて書き込むと、期待どおりに動作します。 –

関連する問題