【问题标题】:C# Multi-Threading on tables' columns performance issueC# 多线程处理表的列性能问题
【发布时间】:2016-09-22 04:49:32
【问题描述】:

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

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

现在,出于某种原因,下面的代码 sn-p 不会 产生任何加速效果。实际上,与单线程顺序处理相比,所花费的时间仅相差几秒钟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 函数,它似乎也给出了相同的结果。缺乏性能改进让我摸不着头脑。

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

【问题讨论】:

  • 是加密IO还是内存操作?调用大量线程必然会使系统/处理速度变慢。在Parallel.For 中,提供具有最大并行度的并行选项,即相同的环境处理器数量。我更愿意将其转换为 Async-Await 调用,它非常有效地执行 IO,不需要线程。
  • ProcessingAlgorithm 函数纯粹是基于内存的操作。在函数中,只有局部变量被实例化来修改输入字符串,因此不应该有任何内存共享或类似的情况。
  • 你能检查一下什么需要更多时间In memory processingFile IO
  • 这段代码的结果是否正确,与顺序处理的结果一致?
  • 我已经分析了我的整个程序,并且所需的主要时间块是在我发布的这个循环中。读取/写入表数据范围大约需要几秒钟。然而,这个循环可能需要一分钟,这是我尝试多线程的主要动机。

标签: c# multithreading performance


【解决方案1】:

很确定这不是您最大的性能问题 - 这里发生了其他事情(真的需要看看您的 ProcessingAlgorithm 正在做什么) - 但您可以通过替换来消除循环中的 2 个字典查找:

m_TableData[KeyPair.Key]

KeyPair.Value

所以你最终得到:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-07
    • 2022-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多