Чтение миллионов маленьких файлов с C # - PullRequest
1 голос
/ 29 сентября 2019

У меня есть миллионы файлов журналов, которые генерируются каждый день, и мне нужно прочитать их все и собрать в один файл, чтобы выполнить какой-то процесс в другом приложении.

Я ищуСамый быстрый способ сделать это.В настоящее время я использую потоки, задачи и параллели, как это:

Parallel.For(0, files.Length, new ParallelOptions { MaxDegreeOfParallelism = 100 }, i =>
{
    ReadFiles(files[i]);
});

void ReadFiles(string file)
{
    try
    {
        var txt = File.ReadAllText(file);
        filesTxt.Add(tmp);
    }
    catch { }
    GlobalCls.ThreadNo--;
}

или

foreach (var file in files)
{
    //Int64 index = i;
    //var file = files[index];
    while (Process.GetCurrentProcess().Threads.Count > 100)
    { 
        Thread.Sleep(100);
        Application.DoEvents();
    }
    new Thread(() => ReadFiles(file)).Start();
    GlobalCls.ThreadNo++;
    // Task.Run(() => ReadFiles(file));      
}

Проблема в том, что после нескольких тысяч файлов чтения чтение становится все медленнее и медленнее!!

Есть идеи почему?и какие самые быстрые подходы к чтению миллионов маленьких файлов?Спасибо.

1 Ответ

0 голосов
/ 30 сентября 2019

Когда дело доходит до операций ввода-вывода, параллелизм ЦП бесполезен.Ваше устройство ввода-вывода (диск, сеть, что угодно) является вашим узким местом.При одновременном чтении с устройства вы рискуете снизить производительность.

...