我有一个包含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]);
}
答案 0 :(得分:0)
更重要的是,您的磁盘速度非常快。假设您受I / O限制(即您对数据进行的计算并不是非常昂贵),最好我希望在处理时间最多的两个或三个文件是有用的(发出并发I / O操作可以帮助磁盘I / O层更有效地调度硬件上的I / O操作。
即使您的计算过于昂贵而且瓶颈是CPU,也不会有比CPU内核更多的并发操作。
如果没有有用的细节可以准确地解释你在这里做了什么,我会说最好的办法就是忘记同时处理文件。按顺序执行它们并跳过所有多线程错误。
如果您对处理过程有所了解,可以确保某些并发性很重要,那么您需要在问题中更加具体。但即使在那里,你也应该限制你的并发性;超越有用的并发程度实际上可能是有害的,因为越来越多的线程最终争夺相同的瓶颈,导致代价高昂的开销,如线程上下文切换和I / O总线拥塞。