用于大型数据集的多线程方法

时间:2015-02-04 09:55:37

标签: c# multithreading task

我有一个包含51个类(51个文件夹/目录)的大型数据集,每个类有10个不同的实例(每个目录10个子目录),每个实例有600个视图(600个文件,每个子目录10 MB)。 / p>

我正在使用锯齿状的任务来并行读取这些文件,即

Task[][] threads = new Task[51][10];

更多用途可以在Jagged array of tasks - Concurrency Issues

找到

有没有比这更好的方法,因为它需要无法预料的错误?

修改:在被删除的情况下从引用的链接发布代码

Task[][] threads = new Task[InstancesDir.Length][];
for (int i = 0; i < InstancesDir.Length; i++)
{
    threads[i] = new Task[InstancesDir[i].Length];
}
for (int i = 0; i < FilesDir.Length; i++)
        {
            for (int j = 0; j < FilesDir[i].Length; j++)
            {

                threads[i][j] = Task.Run(() =>
                {
                    Calculate(i, j, InstancesDir, FilesDir, PointSum);
                });


            }

            Task.WaitAll(threads[i]);
        }

1 个答案:

答案 0 :(得分:0)

坦率地说,你不清楚你是如何达到这个设计的。查看引用的帖子(你真的应该在这里包括所有相关的细节......如果其他帖子被重命名或删除会怎么样?),看起来你一次只能等待十个任务。那么为什么要费心存储所有510?

更重要的是,您的磁盘速度非常快。假设您受I / O限制(即您对数据进行的计算并不是非常昂贵),最好我希望在处理时间最多的两个或三个文件是有用的(发出并发I / O操作可以帮助磁盘I / O层更有效地调度硬件上的I / O操作。

即使您的计算过于昂贵而且瓶颈是CPU,也不会有比CPU内核更多的并发操作。

如果没有有用的细节可以准确地解释你在这里做了什么,我会说最好的办法就是忘记同时处理文件。按顺序执行它们并跳过所有多线程错误。

如果您对处理过程有所了解,可以确保某些并发性很重要,那么您需要在问题中更加具体。但即使在那里,你也应该限制你的并发性;超越有用的并发程度实际上可能是有害的,因为越来越多的线程最终争夺相同的瓶颈,导致代价高昂的开销,如线程上下文切换和I / O总线拥塞。