0

マルチセンサー取得ツールを開発していますが、(ウェブカメラからの) 画像をハード ドライブに保存する際に問題が発生しています。

そのために、次の 3 つのスレッドを使用しています。

  • ウェブカメラからキャプチャされた画像を継続的に収集する 1 つのスレッド。
  • 最後の画像を収集してファイル保存メソッドに送信するタイマー スレッド。
  • タイマー スレッドは、メインのタイマー スレッド機能に干渉しないように、保存する 3 番目のスレッドを呼び出します。

これは、低周波ではうまく機能します。FPS を約 30 に上げると、画像が失われ始めます。ウェブカメラだけでなく、複数のセンサーがあることに注意してください。そのため、このアーキテクチャを使用しており、ウェブカメラ スレッドからファイルを直接保存していません (すべてを同期しておく必要があります)。

これは、save メソッドの現在の実装です。

private void saveImageFrame(Bitmap b, ulong frameID)
    {
        string fileSavePath = _path+ "//";
        if (b != null)
        {
            Task.Factory.StartNew(() =>
            {
                lock (_lock)
                {
                    Bitmap toSave = new Bitmap(b);
                    string fileName = fileSavePath + frameID.ToString() + ".bmp";
                    toSave.Save(fileName);
                }
            });
        }
    }

また、Task スレッド (保存用) とロックなしで試しました。これら 2 つは、タイマーの時間間隔よりも保存に時間がかかるため、競合状態になります。

アーキテクチャと .NET 機能の両方の観点から、これを行うためのより良い方法があると確信しています。これのパフォーマンスを向上させるための助けがあれば大歓迎です!

4

1 に答える 1

4

ディスクの速度が十分でない可能性があります。非常に高速なディスク サブシステムは、おそらく毎秒 100 メガバイトの書き込み速度を維持できます。これは、既にファイルを開いている場合です。1 秒あたり 30 個以上のファイルを作成しようとしており、それ自体がシステムにかなりの負荷をかけています。データの書き込みに必要な時間を追加すると、ファイル システムの機能をプッシュすることになります。

この問題は、フォルダー内のファイル数が増えるにつれて悪化します。たとえば、フォルダーに 1,000 個のファイルがある場合、処理は非常に高速です。10,000 個のファイルを 1 つのフォルダーに入れると、そのフォルダーに新しいファイルを作成するのに長い時間がかかることがわかります。

ハードウェア パフォーマンスの制限に直面している場合は、いくつかのアクション コースがあります。

  1. より高速なハードウェアを入手してください。たとえば、2 番目の非常に高速な専用ドライブ。
  2. 作成するファイルの数を減らします。おそらく、複数の画像を圧縮形式で保存し、それらをすべて 1 つのファイルとしてディスクに書き込むことができます (たとえば、zip ファイル)。またはフレームレートを下げてください。
  3. 書き込むデータの量を減らします (圧縮またはイメージ サイズの縮小によって)。
于 2013-09-04T14:36:41.087 に答える