現在、約 170,000 の jpg ファイル名の .txt ファイルがあり、それらすべてをリスト (fileNames) に読み込みます。
1 つのフォルダー (このフォルダーにはサブフォルダーがあります) を検索して、fileNames の各ファイルがこのフォルダーに存在するかどうかを確認し、存在する場合は新しいフォルダーにコピーします。
大まかな見積もりを作成しましたが、fileNames の各ファイル名の各検索とコピーには約 0.5 秒かかります。したがって、170,000 秒はおよそ 48 時間なので、2 で割ると、アプリが 1 つのスレッドを使用してすべてのファイル名を検索するのに約 24 時間かかります! 明らかにこれは長すぎるので、これを絞り込んでプロセスをスピードアップしたいと思います。マルチスレッドを使用してこれを行うための最良の方法は何ですか?
現在、20 の個別のスレッドを作成し、リスト (fileNames) を 20 の異なるリストに分割して、ファイルを同時に検索することを考えていました。たとえば、以下を同時に実行する 20 の異なるスレッドがあるとします。
foreach (string str in fileNames)
{
foreach (var file in Directory.GetFiles(folderToCheckForFileName, str, SearchOption.AllDirectories))
{
string combinedPath = Path.Combine(newTargetDirectory, Path.GetFileName(file));
if (!File.Exists(combinedPath))
{
File.Copy(file, combinedPath);
}
}
}
以下の私の解決策を示すために更新されました:
string[] folderToCheckForFileNames = Directory.GetFiles("C:\\Users\\Alex\\Desktop\\ok", "*.jpg", SearchOption.AllDirectories);
foreach(string str in fileNames)
{
Parallel.ForEach(folderToCheckForFileNames, currentFile =>
{
string filename = Path.GetFileName(currentFile);
if (str == filename)
{
string combinedPath = Path.Combine(targetDir, filename);
if (!File.Exists(combinedPath))
{
File.Copy(currentFile, combinedPath);
Console.WriteLine("FOUND A MATCH AND COPIED" + currentFile);
}
}
}
);
}
皆様、ご協力ありがとうございました!大感謝!