C#多线程对表的列性能问题

时间:2016-09-22 04:49:33

标签: c# multithreading performance

我目前遇到使用C#Threads获得性能优势的问题。我目前在这里做的是加密表格文件(.csv)中所选列的全部内容。该程序通常用于大型文件,其大小可达到数TB,具有数百万行和多列。

为了获得最佳性能,我计划在每个列的单独线程中创建和运行处理算法。我相信每列所需的大量计算都需要保证一个线程。或者至少在我使用 C ++线程进行类似项目时是如此。

现在,出于某种原因,不会下面的代码片段会产生任何加速。实际上,与单线程顺序处理相比所花费的时间仅在几秒钟内 SLOWER 不同。无论我是同时处理1列,4列还是128列,结果大致相同。

// NOTE:
// m_TableData is of type |--Dictionary<int, List<string>>--|
// Key   == Column Number
// Value == Column Contents

List<Thread> Threads = new List<Thread>();

// encrypt data in selected columns
foreach (var KeyPair in m_TableData)
{
  Threads.Add(new Thread(new ThreadStart(() =>
  {
    // Process each row element
    // NOTE: ColSize is usually huge (>10,000)
    int ColSize = KeyPair.Value.Count();
    for (int i = 0; i < ColSize; ++i)
    {
      m_TableData[KeyPair.Key][i] = ProcessingAlgorithm(m_TableData[KeyPair.Key][i]);
    }
  })));
  Threads.Last().Start();
}

foreach (Thread th in Threads)
  th.Join();

为了试图阻止虚假共享和/或更好的缓存性能,我甚至尝试将行拆分为500,1000,10000等批次,但无济于事。我甚至尝试过 System.Threading.Tasks.Parallel.ForEach 函数,它似乎也给出了相同的结果。缺乏性能提升让我感到很难过。

这里有专业/经验丰富的并行处理程序员吗?我非常感谢我的代码和问题的任何反馈和批评。谢谢!

1 个答案:

答案 0 :(得分:0)

非常确定这不是您最大的性能问题 - 此处还有其他事情(确实需要查看您的ProcessingAlgorithm正在做什么) - 但您可以通过替换来消除循环中的2个字典查找:

m_TableData[KeyPair.Key]

KeyPair.Value

所以你最终得到:

for (int i = 0; i < ColSize; ++i)
{
    KeyPair.Value[i] = ProcessingAlgorithm(KeyPair.Value[i]);
}

(我可能实际上将列表分配给局部变量而不是使用KeyPair)