あなたは、単一のファイルに平行書き込みを実行しようとしている多くの問題に実行しようとしています。
w +既存のファイルを書き込み操作の前に長さ0に切り捨てるか、新しいファイルを作成します。どのように並列ファイルポインタの書き込みを調整しますか?
いずれにしても複数のライターがある場合は、それらを同期させる必要があり、シーケンシャルライトではスピードを上げることができなくなります。実際、単一の専用シーケンシャル書き込みスレッドよりも同期オーバーヘッドのためにおそらく遅くなります。
あなたの質問についてもう少し考えてみてください。もしあなたが本当に巨大な配列を持っていたら、5億の整数を言うなら、この配列を永続的なファイルに読み書きする最も速い方法が本当に必要でした。配列を割り当てることができる専用スレッドの数で割って、各セグメントを別々のファイルに書き込むことができます。このデータを並列に読み込むことで、この配列を配列に読み戻すことができます。この場合、Parallel For型のパターンを使用して、単一ファイルで同期ロックオーバーヘッドを回避できます。
私が与えた例では、4つのスレッドがある場合、各スレッドが独自の四半分を別々のファイルに書き込んだり読んだりする配列間を分割します。
注:すべてのファイルが同じディスクドライブ上にある場合は、ディスクのさまざまな部分で複数の同時読み取り/書き込み操作を実行すると、I/O速度が低下することがあります。この効果は、各ファイルを別のディスク/サーバーに保存できる場合に仲介できます。
もちろん、_textファイル_は本質的に連続したデータ構造であることに注意してください。 – AlexP
ベクトルの順序を保持したい場合、私はそれが可能ではないと思います(少なくともあなたが提案するコードの行ではありません)。それでもストレージへの書き込みは、私が認識しているアーキテクチャーに対する逐次的なプロセスです。私が間違っていると証明された場合でも、私は欲しいです。 –
別々のスレッドやフォーク(プロセス)から書いているのなら、各行がアトミックな方法で書かれていることを確認するために、 'mutex'を使うことができます。しかし、あなたがミューテックスが利用可能になるのを待っているあなたの時間を無駄に過ごしている各書き込みの間に何十何百回の操作をしていない限り、注意してください。 これは間違いなく、時期尚早の最適化を避けるべきケースです。 – KevinDTimm