Оптимизировать параллельный вызов метода - PullRequest
0 голосов
/ 25 февраля 2019

У меня есть несколько аудиофайлов (около 400 ГБ), которые я хочу преобразовать в другой формат.Я написал код преобразования и вызывал его параллельно для каждого файла в каждом каталоге, но он работает немного медленно (например, 50 ГБ за 4 часа).

Не могли бы вы дать совет, как ускорить этот вызов?

// Recursivly find all directories in given path
        DirectoryFinder finder = new DirectoryFinder();
        List<string> dirs = finder.GetDirectories(inPath);

        Parallel.ForEach(dirs, (dir) => {
            var files = Directory.GetFiles(dir, "*.vox");

            Parallel.ForEach(files, (file) =>
            {
                try
                {
                    VoxDecoder.DecodeFile(file);
                } catch (Exception e)
                {
                    Console.WriteLine(e.Message);
                }
            });
        });

E:

Просто добавьте еще немного информации: Скрипт преобразования не может быть хорошо оптимизирован, потому что это сторонняя библиотека.Я думаю, что есть некоторые недостатки в ThreadPool, потому что вначале он работал довольно быстро, а теперь он замедляется к тому времени.

Использование оперативной памяти составляет около 400-600 МБ / 16 ГБ, высокая загрузка ЦП (около 100%)он заблокирован на 435 потоках.

Мне просто интересно, почему при запуске он был очень быстрым, а теперь очень медленным.

Спасибо всем.

1 Ответ

0 голосов
/ 25 февраля 2019

это интенсивный процесс ввода-вывода и должен обрабатываться в задаче, чтобы не вызывать блокировку ввода-вывода.Словарь / Параллельный словарь должен быть заблокирован с помощью spinlock , чтобы параллельные задачи не попадали в критическую секцию.VoxDecoder должен иметь свою задачу.В зависимости от среды должна быть сбалансирована нагрузка, чтобы не позволить всем задачам работать параллельно для эффективного использования ОЗУ / процессора

...