2017-02-09 4 views
1

大きな配列を.csvファイルにcで書きたいと思います。 それを並行して書くことは可能でしょうか?Cで入出力演算を並列に行うことはできますか?

多分OpenMPを使用していますか?

パラレル化したいコードは、ファイル内の一般的なIO操作です。 resutVector1とサイズnのresultVector2考える 、

fp=fopen("output.csv","w+"); 
for(i=0;i<n;i++){ 
    fprintf(fp,"%f,%f\n",resultVector1[i],resultVector2[i]); 
} 
fclose(fp); 
+2

もちろん、_textファイル_は本質的に連続したデータ構造であることに注意してください。 – AlexP

+0

ベクトルの順序を保持したい場合、私はそれが可能ではないと思います(少なくともあなたが提案するコードの行ではありません)。それでもストレージへの書き込みは、私が認識しているアーキテクチャーに対する逐次的なプロセスです。私が間違っていると証明された場合でも、私は欲しいです。 –

+0

別々のスレッドやフォーク(プロセス)から書いているのなら、各行がアトミックな方法で書かれていることを確認するために、 'mutex'を使うことができます。しかし、あなたがミューテックスが利用可能になるのを待っているあなたの時間を無駄に過ごしている各書き込みの間に何十何百回の操作をしていない限り、注意してください。 これは間違いなく、時期尚早の最適化を避けるべきケースです。 – KevinDTimm

答えて

2

あなたは、単一のファイルに平行書き込みを実行しようとしている多くの問題に実行しようとしています。

w +既存のファイルを書き込み操作の前に長さ0に切り捨てるか、新しいファイルを作成します。どのように並列ファイルポインタの書き込みを調整しますか?

いずれにしても複数のライターがある場合は、それらを同期させる必要があり、シーケンシャルライトではスピードを上げることができなくなります。実際、単一の専用シーケンシャル書き込みスレッドよりも同期オーバーヘッドのためにおそらく遅くなります。

あなたの質問についてもう少し考えてみてください。もしあなたが本当に巨大な配列を持っていたら、5億の整数を言うなら、この配列を永続的なファイルに読み書きする最も速い方法が本当に必要でした。配列を割り当てることができる専用スレッドの数で割って、各セグメントを別々のファイルに書き込むことができます。このデータを並列に読み込むことで、この配列を配列に読み戻すことができます。この場合、Parallel For型のパターンを使用して、単一ファイルで同期ロックオーバーヘッドを回避できます。

私が与えた例では、4つのスレッドがある場合、各スレッドが独自の四半分を別々のファイルに書き込んだり読んだりする配列間を分割します。

注:すべてのファイルが同じディスクドライブ上にある場合は、ディスクのさまざまな部分で複数の同時読み取り/書き込み操作を実行すると、I/O速度が低下することがあります。この効果は、各ファイルを別のディスク/サーバーに保存できる場合に仲介できます。

+0

まあ、HDF5ファイルは[パラレル](https://support.hdfgroup.org/HDF5/PHDF5/)でも読めるようです[Lustre](http://lustre.org/)と[XIOS](http://forge.ipsl.jussieu.fr/ioserver/wiki) – Marouen

+1

@MarouenBenGuebilaはい、あなたは正しいですが、HDFSファイルはモノリシックファイルですが、多くの部分に分割されており、これらはパラレルリードを使用して同時に読み戻すことができます。それはまさに私が上で説明した解決策です。配列をサブセクションに分割し、それぞれを独自のファイルに白くすることができます。その後、並列読み込みでこれらのファイルを同時に読み込みます。これは、並列ライブラリをサポートし、複数のプロセッサを持つ任意のOSで実行できます。 –

1

2つのファイルを開き、それぞれのファイルを独自のファイルに書き込むことができますが、これは役に立ちますが、私はそれに賭けません。プラットフォームのアーキテクチャに依存します。さらに、同じファイルに両方のファイルが必要な場合は、それを一緒にコピーする必要がありますが、もう一度時間がかかります。

また、ハードドライブ自体への書き込みもボトルネックになっているので、バッファをハードドライブにいっぱいにする必要はありません。

2つの異なるハードドライブで2つのファイルを開くことができますが、これは本当にスピードアップするとは思っています。

1

ライブラリを使用して実装された並列読み取りメソッドpreadを書くように質問されました。ファイルサイズがFILESIZEで、スレッド数がnの場合、preadメソッドは入力ファイルをほぼ等しいサイズのFILESIZE/nのチャンクにスライスし、各チャンクをスレッドに割り当てます。次に、各スレッドは、BUFFFERSIZEのパラレルでファイルの異なるオフセットからfreadを使用してファイルの読み込みを開始します。実装hereが見つかります。

これは実行中の実装ですが、私はまだパラレル書き込み側で作業しています。

関連する問題