ファイル内で変更されたバイトの開始範囲と終了範囲の決定
-
08-07-2019 - |
質問
全文検索用にカスタムCRMソフトウェアに保存されたメモのインデックスを作成する、社内で使用する小さな実験ユーティリティに取り組んでいます。これらのメモはBtrieveデータベース(NOTES.DATというファイル)に保存されます。 PervasiveのADO.NETプロバイダーを使用して、データベースに接続し、インデックス作成のためのメモを取得することができます。ただし、インデクサーは現在、各ノートをループし、5分ごとにインデックスを再作成します。これは非常に効率が悪いようです。
残念なことに、データベースがリモートマシン上に存在する可能性があるため、CRMソフトウェアがインデックスサービスに通知する方法はありません(開発者は手順を記述しません)ただの趣味のプロジェクトであるため、ネットワークを介してサービスと通信します。
あきらめるのではなく、この機会に生のBtrieveデータベースについてもう少し学びたいと思います。だから、これが私の計画です...
NOTES.DATファイルは共有する必要があります。これは、CRMソフトウェアがODBCドライバーではなくBtrieve APIを使用しているためです(つまり、クライアントインストールはネットワーク上でファイル自体を確認できる必要があります)。このファイルを監視し(FileSystemWatcherなどを使用)、変更されたバイトを特定します。その情報を使用して、その位置でレコードを計算し、その主キーを取得しようとします。その後、インデクサーはPervasiveのADO.NETプロバイダーを使用してそのレコードのみを更新します。
問題(Btrieveファイルの構造がまだよくわからないという事実、または生データから主キーを決定できる場合は別ですが)は、開始範囲と終了範囲を決定する方法がわからないことです。 NOTES.DATで変更されたバイト数。
2つのバージョンを比較できますが、NOTES.DATのコピーをどこかに保存することになります(非常に大きくなる可能性があるため、フルテキストインデックスサービスの理由です)。
これを行う最も効率的な方法は何ですか?
ありがとう!
編集:1つのトランザクションで複数のノートを追加、編集、または削除できるため、可能であれば、メソッドは複数の個別のバイト範囲を決定できる必要があります。
解決
NOTES.DAT
ファイルが NTFSパーティションに保存されている場合、次のいずれかを実行できるはずです:
- USNジャーナルを使用して、ファイルへの変更(推奨)
- 定期的なスナップショットを作成してファイルへの変更を追跡するには、ボリュームシャドウコピーサービスを使用しますVSS(非常に高速)、および次のいずれか:
-
diff
バージョンN
およびN-1
ing(おそらくインデックスの再作成ほど遅くはないが、まだ遅い)、または - より深く掘り下げ、
diff
を実行して$ Mft
を実行し、目的のファイルのどのオフセットでどのブロックが変更されたかを判断します(より複雑ですが、はるかに高速ですが、それでもUSNジャーナルを使用するほど高速、信頼性、シンプルではありません)
-
USNジャーナルを使用することをお勧めします。 FSUTIL
ユーティリティを使用して、 USNジャーナルを作成して切り捨てます。