В настоящее время у меня есть .txt-файл из примерно 170 000 jpg-файлов, и я читаю их все в List (fileNames).Поиск по нескольким темам в одной папке в то же время
Я хочу найти одну папку (в этой папке есть подпапки), чтобы проверить, существует ли каждый файл в именах файлов в этой папке, и если да, скопируйте его в новую папку.
Я делал приблизительную оценку, но каждый поиск и копирование для каждого имени файла в файлах имен занимает около 0,5 секунд. Таким образом, 170 000 секунд составляют примерно 48 часов, поэтому разделите на 2, что займет около 24 часов, чтобы мое приложение искало каждое имя файла, используя 1 поток! Очевидно, это слишком долго, поэтому я хочу сузить это и ускорить процесс. Каков наилучший способ сделать это с помощью многопоточности?
В настоящее время я думал создать 20 отдельных потоков и разбить мой список (имена файлов) на 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);
}
}
}
);
}
Спасибо всем за ваш вклад! Очень ценим!
Если я читаю вас правильно, то почему бы не прочитать все имена файлов, как только в памяти, как HashSet, а затем использовать его для поиска файла. Что касается ускорения дискового ввода-вывода с несколькими потоками, то это только до сих пор. После того как диск IO превышен, неважно, сколько потоков у вас есть. – cost
Не только диск IO также будет сильно зависеть от количества процессорных ядер, доступных для обработки логики потока, поэтому в конечном итоге это плохое решение. –
Вы пытались использовать TPL foreach? https://msdn.microsoft.com/en-us/library/dd460720(v=vs.110).aspx – qamar