2

私は FileShare クローラーを持っています (権限を取得し、後で監査するためにそれらをどこかにドロップします)。現在、同じフォルダーをクロールするために複数のスレッドを開始しています (プロセスを高速化するため)。

C# では、各オブジェクトには、呼び出しによって開始されるSqlConnection独自のがあります。SqlTransactionSqlConnection.BeginTransaction()

現在のソリューションの疑似コードは次のとおりです。

  1. フォルダのリストを取得する
  2. 各フォルダについて、サブフォルダのリストを取得します
  3. サブフォルダーごとにスレッドを開始して、ファイル共有を収集します
  4. 各スレッドは収集したデータをデータベースに保存します
  5. データベースで監査レポートを実行する

サブフォルダのスレッドの 1 つが失敗すると、問題が発生します。「簡単に検出できない」部分的なフォルダ スキャンに行き着きます。主な理由は、各スレッドが別々の接続で実行されていることです。

不完全なスキャンを行うのではなく、各フォルダーを同じトランザクションでコミットしたいと考えています (現在の状況では、一部のスレッドが失敗した場合)。トランザクションの概念は実装されていませんが、オプションを評価しています。

この回答のコメントに基づいて、プロデューサー/コンシューマーキューはオプションですが、残念ながらメモリは制限されています(開始されたスレッドの数による)。プロデューサ/コンシューマ スペースが RAM 制限を克服するためにディスクにコミットされている場合、実行時間は増加します (メモリ I/O と比較してディスク I/O が非常に限られているため)。私はメモリ/時間の妥協で立ち往生していると思います。他の提案はありますか?

4

1 に答える 1