优化并行方法调用

时间:2019-02-25 17:01:45

标签: c# task-parallel-library parallel.foreach

我有一些音频文件(大约400GB),我想将其转换为其他格式。我编写了转换代码,并与每个目录中的每个文件并行调用,但是运行速度有点慢(例如每4小时50GB)。

您对如何加快通话速度有何建议?

// 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缺少一些东西,因为一开始它运行的非常快,但到现在它的速度变慢了。

Ram的使用量约为400-600MB / 16GB CPU使用率很高(大约100%),它锁定在435个线程上。

我只是想知道为什么一开始它真的很快,而现在却真的很慢。

感谢所有人。

1 个答案:

答案 0 :(得分:-1)

是一个I / O密集型进程,应在Task中进行处理,以免造成阻塞的I / O。字典/ Concurrent Dictionary应该用spinlock锁定,以防止并行任务进入关键部分。 VoxDecoder应该有自己的任务。 根据环境的不同,应该平衡负载,以免所有任务并行运行以有效利用RAM /处理器