【问题标题】:Update outside loop更新外循环
【发布时间】:2014-09-14 04:49:47
【问题描述】:

我在strFilePath 数组中有各种 csv 文件的位置(几乎 1000 个文件,每个文件中有 100 万条记录)。从文件中读取并将所有数据合并到单个数据表需要大量时间。所以我决定继续进行并行处理。

当前代码

DataTable dtMerge=new DataTable();
for(int i=0;i<strFilePath.Count;i++)
{
     Parallel.For(0, 3,m =>
     {
         clsNewClass objCls=new clsNewClass();
         DataTable dt=objCls.ReadCSV(strFilePath[m+i]);
     });
     m+=3;
}

问题是,如何将数据表 dt 中的所有数据合并到全局数据表 dtMerge 中,或者如何将所有结果包含到全局变量 dtMerge 中?

预期的工作代码

DataTable dtMerge=new DataTable();
for(int i=0;i<strFilePath.Count;i++)
{
     Parallel.For(0, 3,m =>
     {
         clsNewClass objCls=new clsNewClass();
         // Is it possible like the below?
         dtMerge = objCls.ReadCSV(strFilePath[m+i]);
     });
     m+=3;
}

【问题讨论】:

  • 现有代码中有不少错误。 m 未在 m+=3 声明是第一个跳出来的。实际上你可能会更好Parallel.ForEach(strFilePath, filepath =&gt; { ... })
  • 毕竟我将如何合并它?有什么办法不使用 Parallel.Foreach 中的 lock(object) 吗? @斯科特张伯伦

标签: c# datatable parallel-processing parallel.foreach parallel.for


【解决方案1】:

使用Parallel.For(或ForEach)的重载,它为您提供本地初始化程序,最后为线程提供,这样您就可以在不使用锁的情况下在线程内合并您的进度。然后你可以merge你的内部线程表在finally块中使用线程安全锁进入你的外部表。

DataTable dtMerge = new DataTable();

Parallel.ForEach(strFilePath,
     () => new DataTable(),
     (filePath, loopState, local) =>
     {
         clsNewClass objCls=new clsNewClass();
         // Is it possible like the below?
         var dt = objCls.ReadCSV(filePath);
         local.Merge(dt, true, MissingSchemaAction.Add);
         return local;
     },
     (local) =>
     {
         lock(dtMerge)
         {
             dtMerge.Merge(local, true, MissingSchemaAction.Add);
         }
     });

我也摆脱了你的外部 for 循环,并用并行 foreach 替换了你的内部循环,没有理由像这样嵌套你的循环,只需使用 ForEach

【讨论】:

  • 我有一个疑问。这个锁会真正反映 Parallel.ForEach 的性能吗?实际上 lock 确保一次只能访问 1 个对象。对吗???
  • 锁只在工作线程被释放时才会发生,所以它很少发生。 local.Merge 是一个会发生很多并且没有锁(也不需要一个,因为您要合并到的表是线程本地对象)
  • 非常感谢您宝贵的时间和回答 :) @Scott Chamberlain
猜你喜欢
  • 2013-01-31
  • 2015-05-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多