質問:
- 主な質問: これらの仕事を並行させるための最善の戦略は何ですか?
- アイデア: 2 番目のチェックサム (Adler32?) などの他のメカニズムを使用してプロセスを高速化する方法
シナリオ:
Javaで一種の同期ツールを書いています。基本的に、ローカル マシン上のファイル/ディレクトリ構造を表す Web サーバーからリポジトリをダウンロードし、必要なファイルのソースをハッシュ値と組み合わせて圧縮形式で定義し、ファイルを検証します。私が推測する基本的なこと。
要件:
- マルチプラットフォーム Java デスクトップ アプリケーション
- 可能な限り最高の速度と並列化
構造の例: (ゲームのモッズを使用して最もよく説明されています)
リポジトリ ファイルの例
{"name":"subset1", "mods":[
{
"modfolder":"mod1",
"modfiles":[
{
"url":"http://www.example.com/file2.7z",
"localpath":"mod1/file2",
"size":5,
"sizecompressed":3,
"checksum":"46aabad952db3e21e273ce"
},
{
"url":"http://www.example.com/file1.7z",
"localpath":"mod1/file1",
"size":9,
"sizecompressed":4,
"checksum":"862f90bafda118c4d3c5ee6477"
}
]
},
{
"modfolder":"mod2",
"modfiles":[
{
"url":"http://www.example.com/file3.7z",
"localpath":"mod2/file3",
"size":8,
"sizecompressed":4,
"checksum":"cb1e69de0f75a81bbeb465ee0cdd8232"
},
{
"url":"http://www.example.com/file1.7z",
"localpath":"mod2/file1",
"size":9,
"sizecompressed":4,
"checksum":"862f90bafda118c4d3c5ee6477"
}
]
}
]}
同期後のクライアント ファイル構造
mod1/
file2
file1
mod2/
file3
file1
// mod1/file2 == mod2/file2
リポジトリに関する特別な点: サーバーから取得したリポジトリは、より大きなリポジトリのサブセットのみを表します。これは、ユーザーが必要とするのはサブツリーのみであり、変更されています (これも重複しています)。リポジトリが mod1 と mod2 で構成される場合もあれば、mod1 と mod3 で構成される場合もあります。
やるべきこと:
- リポジトリをダウンロードして解析する (Net I/O)
- リポジトリにないファイルをプロセスの最後に削除するようにマークします (ファイルは同じチェックサムのためにコピーされる可能性があります) (ファイル I/O)
- ファイルが存在する場合:既存ファイルのチェックサムチェック(チェックサムキャッシュ)(ファイルI/O)
- ファイルが存在しない場合: checksumcache で他のサブツリーにある同一のファイルをチェックして、ファイルをダウンロードする代わりにコピーします (ファイル I/O の軽量化)。
- 単一ファイルを圧縮形式でダウンロード (Net I/O)
- 圧縮ファイルの抽出 (ファイル I/O)
- 非圧縮ファイルのチェックサム (ファイル I/O)
- ファイルに関連付けられたキャッシュ チェックサム。(ライトファイルI/O)
私の解決策:(多くの異なる生産者/消費者)
- チェックサム キャッシュは、MapDB の永続的なマップを使用しています。
- ATM のみ md5 チェックサムが使用されます。
- キュー: すべての Workertype にはブロッキング キュー (プロデューサー/コンシューマー) があります。
- スレッドプール: すべてのワーカータイプには、3 つのダウンローダー、2 つのチェックサムなど、固定のスレッドプールがあります。
- ワーカーは現在のジョブを他のキューに配布します: Downloader -> Extract -> Checksum
ワーカータイプ:
- Localfile Worker: ローカル ファイル構造をチェックし (チェックサム キャッシュを使用)、作業を Download-Worker、Delete-Worker にリダイレクトします。
- コピー: チェックサムが同じファイルを宛先にコピーします。
- ダウンロード: ファイルをダウンロードします
- チェックサム: ファイルのチェックサムと checksumcache への挿入
- 削除: ファイルを削除します
- 抽出: 圧縮ファイルを抽出します