【发布时间】: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 processing或File IO -
这段代码的结果是否正确,与顺序处理的结果一致?
-
我已经分析了我的整个程序,并且所需的主要时间块是在我发布的这个循环中。读取/写入表数据范围大约需要几秒钟。然而,这个循环可能需要一分钟,这是我尝试多线程的主要动机。
标签: c# multithreading performance