大型数据集的多线程方法

Multithreaded approach for large datasets

我有一个 51 classes (51 folders/directories) 的大数据集,每个 class 有 10 个不同的实例(每个目录 10 个子目录),每个实例有 600 个视图(每个子目录 600 个 10 MB 的文件)。

我正在使用参差不齐的任务数组来并行读取这些文件,即

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

可以在

找到更多使用方法

有没有比这个更好的方法,因为它需要不可预见的错误?

编辑: 发布引用的代码 link 以防被删除

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]);
        }

坦率地说,完全不清楚您是如何得出这个设计的。查看引用的 post(您真的应该在此处包括所有相关详细信息......如果其他 post 被重命名或删除会发生什么情况?),看起来您只等待十个任务一个时间。那么为什么还要存储所有 510 个呢?

更重要的是,您的磁盘只有这么快。假设你是 I/O 绑定的(即你对数据所做的计算不是非常昂贵),我最多希望同时处理两个或三个文件是有帮助的(发布并发 I/O操作可以帮助磁盘 I/O 层更有效地调度硬件上的 I/O 操作。

即使您的计算如此昂贵以至于瓶颈是 CPU,拥有比 CPU 个内核更多的并发操作也无济于事。

缺少可以准确解释您在这里做什么的有用细节,我想说最好的办法是忘记并发处理文件。按顺序执行它们并跳过所有多线程错误。

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