デスクトップJava 8.で小さなビデオフレーム分析アプリを作成しました。各フレームで、データを抽出します(5倍になりましたが、将来1920x1080x3 OpenCV Mat
に拡張される可能性があります) )このデータをデータベース(Java DBなど)に保存して、時系列分析を実行し、定期的に結果をユーザーに返します。
データベースに書き込み、シングルスレッドでアプリを実行する場合のハードドライブアクセス時間を心配しています。私に発生した最善の解決策は、マルチスレッドでプロデューサー/コンシューマーパターンを実装することです。私が見つけた例はすべて3つのスレッドを実装しています:
2スレッドの実装と比較して、それを行うことには利点がありますか?
そして、それはデータベースでリアルタイムデータを処理する正しい方法ですか?
PS:上記の質問が尋ねられた here が、代わりにSE.programmersで尋ねた方がよいと言われました。
これらの選択の違いは、スレッドへのタスク割り当てのアフィニティにあります。
以前の質問 で説明したように、このアフィニティを実装するかどうかは完全にあなたの選択です。スレッドに対するタスクの親和性なしにマルチスレッドを実装する方法があります。
プロデューサー-コンシューマーパターンは、次の場合に適しています。
スループット(*)を最大化するには、一般的に次のことを試みます。
(*)スループットの最大化-1秒あたりに処理されるビデオフレームの数-が最終的な目標です。 CPU使用率を最大化しない。
アルゴリズムの改善などの一部の最適化により、そのステージのCPU使用率が低下しますが、全体的な効率が向上するため、実行されるCPU命令の総数を少なくして同じ結果を計算できます。
(*)[0]
と[1]
のタグが付いた2つのデータが処理されると、[1]
の出力が事前に完了する場合があるため、並べ替えキューが必要です。パイプラインの順序付けプロパティを保持するには、[1]
の出力が準備できるまで、[0]
の出力を保持する必要があります。
これらの変更がスループットを望ましいレベルに最大化するのに十分でない場合、単一パイプラインのプロデューサー/コンシューマーパターンから離れて、データフローまたはデータグラフフレームワークに移動することもできます。
より一般的なデータフローまたはデータグラフフレームワークでは:
免責事項:ここで使用されている用語の一部は、不完全であるか正しくない場合があります。修正は歓迎です。