【问题标题】:How can I speed up my loops in c#如何在 C# 中加快循环速度
【发布时间】:2014-11-03 06:56:39
【问题描述】:

我必须迭代超过 100 万个项目,我的下一步行动取决于对这 100 万个项目的成功迭代。 截至目前,我正在使用 C# 的 While 循环,完成迭代大约需要 5-6 分钟。有没有办法加快这个处理?稍后我可能有大约 5-6 百万个项目要迭代。

        System.IO.StreamReader file =
           new System.IO.StreamReader("data.csv");
        System.IO.StreamWriter jsonFile =
           new System.IO.StreamWriter("jsonData.csv");
        BBP obj;
        var dataList = new Dictionary<string, dynamic>();
        while ((line = file.ReadLine()) != null)
        {
            if (counter == 0)
            {
                columns = line.Split(',');
            }
            else
            {
                data = line.Split(',');

                obj = new BBP();
                obj.BBP_CR_PART_NO = data[0];
                obj.BBP_RO_NO = data[1];
                obj.BBP_BPR_TPN = data[2];
                dataList.Add("item_" + counter, obj);
                Console.WriteLine(counter);
            }
            counter++;
        }

【问题讨论】:

  • 这个问题太模糊和投机。循环本身并不是天生慢的。在现代硬件上,100 万次无所事事的迭代花费不到一秒钟的时间。但是你没有发布慢的代码,所以没有人可以评论。请看stackoverflow.com/help/mcve
  • 是的邮政编码,否则我们无能为力,您如何“使用 while 进行迭代”?如果迭代集合,只需使用 foreach,我可以向您保证,缓慢的部分不是迭代,而是您在其中所做的任何事情
  • 如果可以使用多线程,在适当的时候使用breakcontinue
  • 一旦你修改了你疯狂模糊的问题,你可能应该做的一件事是尝试对你正在迭代的数组进行排序。如果是一个数组就是。
  • 添加了代码示例。现在请指教。谢谢!!!

标签: c# performance loops iteration


【解决方案1】:

如果您满足以下条件,您可以加快速度:

  1. 读取循环外的第一行,然后删除if (counter == 0) 检查。这将针对每一行进行处理,并且仅具有一次价值。
  2. dataList 更改为List&lt;BBP&gt;。这样您在添加项目时不需要指定键(字符串连接的成本很小),并且您已经有一个可以稍后引用的索引(如果适合您的话)。
  3. 删除计数器增量(此时完全删除计数器)。
  4. 删除控制台输出。

另外,考虑将你的文件分成多个文件,然后你可以实现一个多线程的解决方案,就像这个问题的答案:Read and process files in parallel C#

如果您无法拆分文件,您可以考虑将多行(可能一次 1000 行)读入 List&lt;string&gt;,然后将该列表发送到 Task 进行处理。这样,您读取 1000 行,将它们发送到任务,而任务正在处理您读取接下来的 1000 行,等等。看看这个例子:http://msdn.microsoft.com/en-us/library/jj155756.aspx

最后,考虑将数据存储在数据库中,而不是 .csv 文件中。

【讨论】:

  • Rufus,实际上这就是从文件中读取并从中创建对象的要求。我将纳入您的意见和更新。但一般来说,有没有办法只加速这个代码循环?
  • @MohitVaidh 是的,我的前四个 cmets,加上使用 Tasks 的重新设计选项..?
  • 当然,Rufus,关于任务,我不是很擅长。你能告诉我将什么移到任务部分吗?
  • 试用链接中的示例,并尝试将其应用于您的情况。擅长某事的最好方法就是尝试一下!!
猜你喜欢
  • 1970-01-01
  • 2015-01-18
  • 2014-05-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-09
相关资源
最近更新 更多