2

私は、全文検索用にカスタム CRM ソフトウェアに保存されているメモをインデックス化する、社内で使用するための小さな実験的なユーティリティに取り組んでいます。これらのメモは、Btrieve データベース (NOTES.DAT というファイル) に保存されます。Pervasive の ADO.NET プロバイダーを使用して、データベースに接続し、インデックス作成用のメモを取得することができます。ただし、インデクサーは現在、各メモをループし、5 分ごとに再インデックスを作成します。これは非常に効率が悪いようです。

残念ながら、CRM ソフトウェアがメモが変更されたことをインデックス サービスに通知する方法はありません。これは、データベースがリモート マシンに存在する可能性があるためです (また、開発者は、私と通信するための手順を作成するつもりはありません)。これは今のところ単なる趣味のプロジェクトなので、ネットワーク経由でサービスを提供することはできません)。

あきらめるのではなく、この機会に raw Btrieve データベースについてもう少し学びたいと思います。というわけで、私の計画は…

CRM ソフトウェアは ODBC ドライバーではなく Btrieve API を使用するため、NOTES.DAT ファイルを共有する必要があります (つまり、クライアントのインストールでは、ネットワーク上でファイル自体を認識できる必要があります)。このファイルを (FileSystemWatcher などを使用して) 監視し、変更されたバイトを特定したいと思います。その情報を使用して、その位置のレコードを計算し、その主キーを取得しようとします。次に、インデクサーは、Pervasive の ADO.NET プロバイダーを使用してそのレコードのみを更新します。

問題は (Btrieve ファイルの構造がまだよくわからない、または生データから主キーを決定できるかどうかを除いて) バイトの開始と終了の範囲を決定する方法がわからないことです。 NOTES.DAT で変更されました。

2 つのバージョンを比較することもできますが、それは NOTES.DAT のコピーをどこかに保存することを意味します (そして、それは非常に大きくなる可能性があるため、フルテキスト インデックス サービスが必要になります)。

これを行う最も効率的な方法は何ですか?

ありがとう!

編集: 1 つのトランザクションで複数のメモを追加、編集、または削除する可能性があるため、可能であれば、メソッドは複数の個別のバイト範囲を決定できる必要があります。

4

1 に答える 1

1

NOTES.DATファイルがNTFS パーティションに保存されている場合は、次のいずれかを実行できます。

  • USN ジャーナルを使用してファイルへの変更を特定する (推奨)
  • ボリューム シャドウ コピー サービスを使用して、VSS を介して定期的にスナップショットを作成し (非常に高速)、ファイルの変更を追跡します。次に、次のいずれかを実行します。
    • diffNバージョンをingし、 N-1(おそらくインデックスの再作成ほど遅くはありませんが、それでも遅いです)、または
    • より深く掘り下げて、対象のファイルのどのオフセットでどのブロックが変更されたかを判断しようとしdiffます$Mft(はるかに複雑ですが、はるかに高速ですが、それでも USN ジャーナルを使用するほど高速ではなく、信頼性が高く、単純ではありません)

USN ジャーナルを使用することをお勧めします。このFSUTILユーティリティを使用して、USN ジャーナルを作成および切り捨てることができます。

于 2009-03-10T23:25:44.600 に答える