【问题标题】:Speed up console application, Concurrency? Parralell Programming?加速控制台应用程序,并发?并行编程?
【发布时间】:2015-10-15 06:55:53
【问题描述】:

我有以下(简化的)控制台应用程序:

DirectoryInfo d = new DirectoryInfo(@"D:\Test");
FileInfo[] Files = d.GetFiles("*.txt"); 
foreach(FileInfo file in Files )
{
  //Do Something
}

文件夹中有 200 多个文件。每个文件的处理大约需要 15 分钟。

我的问题是,我是否可以使用并发/并行编程一次处理多个文件?

我在想的事情是,启动多个线程?并且他们每个人都会处理文件列表中每5个左右的文件。

所有文件处理都是完全独立的,所以没有竞争条件的风险。

如果可能的话,我可以启动的线程数是否有限制,或任何其他限制。

将要做的工作是将每个文件的内容加载到一个通用列表中,对其进行处理并多次迭代该列表

【问题讨论】:

  • @Sayse 它将内容加载到通用列表中,对数据执行一些计算并将结果写入文本文件。将为每个输入文件创建一个新的输出文件
  • 这是并行任务的正确工作
  • 这将取决于你的瓶颈在哪里。例如,如果您要最大化 IO,则更多线程会减慢进程。
  • @WDS 所以你的意思是这些任务可以同时执行,但是 IO 容量有限制 - 所以我需要尽量减少这个,例如尽可能少地写入和写入,按顺序? IO 的大概限制是多少?每个文件大约有 12000 行
  • 取决于你有什么。由于我有便宜的硬盘,我电脑上的 IO 实际上可能只有每秒 50 MB。 RAID 阵列会快得多。但听起来 IO 不是你的情况的瓶颈——一个需要 15 分钟处理的 12000 行文件必须在处理中花费比读/写更多的时间,所以是的,这听起来可能是并行的候选者处理。

标签: c# multithreading concurrency


【解决方案1】:

看来Parallel.ForEach 的工作不错。它将为您提供真正的并行化,因为它可以将每次迭代调度到不同的 CPU 内核。

如果可能的话,我可以启动的线程数是否有限制, 或任何其他限制。

我不会产生数百个线程来执行这项工作,因为处理大量线程可能会花费更多时间,因为您的 CPU 和磁盘会太忙。

【讨论】:

    【解决方案2】:
    Task based approach can be a solution, control your task based on available
    resources.
            DirectoryInfo d = new DirectoryInfo(@"D:\Test");
            FileInfo[] Files = d.GetFiles("*.txt");
            foreach (FileInfo file in Files)
            {
               //Check items in ConcurrentDictionary, if exceeds the limit -
               //wait here
    
                Task t = Task.Factory.StartNew((Object o) =>
                {
                  //Do your work
                }, file);
    
                //Add items in ConcurrentDictionary;
            }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-22
      • 2014-12-27
      • 1970-01-01
      • 2019-07-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多