効率的に対処する必要がある以下の状況がありますが、
クライアントデバイスからサーバーへのファイル同期を行っています。サーバーの問題が原因で、あるデバイスのファイルがサーバーから別のデバイスにフェッチされない場合があります。サーバー内のすべてのファイルが、別のスレッドを使用してすべてのクライアントデバイスに同期されていることを確認する必要があります。開発にはC++を使用し、クライアントからサーバーへの通信にはlibcurlを使用しています。
ここのクライアントデバイスには、SQLiteデータベースにダウンロードされたファイルのエントリがあります。同様にサーバーでも、サーバーデータベース(MySQL)でも同様の更新があります。クライアントデバイスから利用可能なすべてのファイルを一覧表示してサーバーに送信し、サーバーデータベースから取得した一覧と比較して、欠落しているファイルを見つける必要があります。
100万個のファイルリスト(フルパスのファイル名)の場合、サイズは約85MBであると概算しました。圧縮すると、最大10MBのサイズになります。したがって、このファイルリスト全体を(圧縮後でも)クライアントからサーバーに転送することはお勧めできません。私はこれのために以下のようにブルームフィルターを実装することを計画しました、
- クライアント側のデータベースからファイルリストを取得し、それらをブルームフィルターデータ構造に変換します。
- ブルームデータ構造のみをクライアントからサーバーに転送するだけです。
- サーバー側のデータベースからファイルリストを取得し、クライアントから受け取ったBloomデータ構造と比較して、不足しているファイルを見つけます。
クライアントから開始された上記のプロセスは、1時間程度ごとなど、定期的にスレッドで処理する必要があることに注意してください。
ブルームフィルターの問題は、たとえそれが非常に低くても、誤検知率です。1つのファイルでも見逃したくない。これを行う他のより良い方法はありますか?