VC++ で OpenCV 2.2 を使用してアプリケーションを作成しています。さまざまなネットワーク ストリームからビデオを取得し、フレームごとに AVI ファイルにそれぞれ別のスレッドで書き込みます。ビデオストリームは数百で、私のアプリケーションは非常に重いディスクに数百のファイルを書き込んでいます。これを行うための最適な方法を教えてもらえますか
前もって感謝します
VC++ で OpenCV 2.2 を使用してアプリケーションを作成しています。さまざまなネットワーク ストリームからビデオを取得し、フレームごとに AVI ファイルにそれぞれ別のスレッドで書き込みます。ビデオストリームは数百で、私のアプリケーションは非常に重いディスクに数百のファイルを書き込んでいます。これを行うための最適な方法を教えてもらえますか
前もって感謝します
まあ。十分なRAMがあることを願っています。
複数のファイルを書くのは本当に苦痛です。あなたができる最善のことは、合理的に可能な限り、常にできるだけ大きなAVIフレームのチャンク(できればセクターサイズの倍数)を書き込むことによって、書き込みシークを軽減することです。多分:
1)「FrameBuf」フレームバッファクラス。起動時に*FrameBufのシットロードを作成し、それらを生産者/消費者キューにプールします。
2)複数の*FrameBufインスタンス用の「FrameVec」コンテナクラス。これらもプールする必要があるかもしれません。
3)*FrameVecの内容をディスクシステムに書き込むためのスレッドプール。これには、シークをほとんど行わずに最高のディスク書き込みパフォーマンスを実現するために、スレッドが非常に少なく、場合によっては1つだけ含まれます。全体的なスループットを最適化するには、実行時にスレッド数を構成可能/変更可能にするのが最適です。すべてを構成可能にするのが最善です-*FrameBufプールの深さ、各*FrameVec内の*FrameBufの数-すべて。
可能であれば、SSDを使用してください。システムに「静かな」時間があれば、蓄積されたaviを大きなスピナーまたはネットワークディスクに移動して、次の「忙しい」時間のためにSSDを解放することができます。
さまざまなインスタンスを移動するときは、次のマントラを覚えておいてください。
'Stack-objects、copy ctors、any template class with no * bad'、および'pointers、pools、pointercontainergood'。
幸運を..