3

カメラから毎秒約 100 フレームの画像ストリームがあり、各画像は約 2 MB です。ディスクの書き込み速度のせいで、各フレームを書き込めないことがわかっているので、毎秒これらのフレームの約 3 分の 1 だけを保存しようとしています。

ストリームは、大きな char 配列の循環バッファーです。そして今、私は fwrite を使用して、各アレイがバッファリングされるときに一時ファイルにダンプしますが、ハードドライブは理論的には 80-100 MB/ s

何かご意見は?fwrite() またはそれを最適化する方法よりも高速に書き込む方法はありますか? より一般的には、大量のデータを標準のハード ドライブにダンプする最速の方法は何ですか?

4

3 に答える 3

1

たとえば、それぞれ 1GB に制限されたメモリ マップ ファイルを使用する場合はどうでしょうか。これにより、すべてのフレームで動作するのに十分な速度とバッファが提供されるはずです。特に、ゼロコピー フレーム割り当てを実行できる場合はそうです。

于 2012-05-27T01:31:02.970 に答える
0

あなたのケースでは、バッファリングされていない非同期出力が成功の鍵です。バッファリングされた IO は、ダブル バッファリング オーバーヘッドのみを引き起こし、同期 IO は、HDD ヘッドにシーケンシャル セクタが失われるようにします。

Boost.Asio は、一般的なプラットフォーム向けのシステム固有の API を比較的適切にカプセル化します。

覚えておくべきことがいくつかあります。

  • Windows 以外のほとんどのプラットフォームでは、生のパーティションに書き込む必要があり、システムのバッファ化と内部スレッドを邪魔にならないようにする必要があります。
  • 書き込みキューを常に空にしないようにしてください。そうすれば、SATA コントローラーが NCQ によってあなたを助けることができます。
  • バッファリングされていない非同期 IO が機能するように、バッファの配置とサイズに関するシステム固有の要件に注意してください。
  • ファイル オープン モードも、システムに必要な動作をさせるために重要です。
于 2012-05-27T04:25:45.490 に答える
0

fwriteこれはあなたが望むものです。その大きなファイル/書き込みでは、大きな違いはありません。setbuf呼び出しでより大きなストリーム バッファを試してみてください。

物理ディスクの I/O 速度によって制限されるため、システムが利用可能な各ディスク I/O を効率的に使用できるようにする限り、これ以上のことはできません。

vmstatLinux (他のシステム上の他の同様のツール) では、ディスクが実行しているディスク i/os の数を知ることができるため、変更が何かに役立つかどうかをテストできます。

于 2012-05-27T00:17:11.350 に答える