gpt4 book ai didi

c# - `使用 Parallel.ForEach 加速文件处理但无法按正确顺序返回

转载 作者:行者123 更新时间:2023-11-30 20:41:41 26 4
gpt4 key购买 nike

所以我尝试使用 Parallel.ForEach 循环来加快文件的处理速度,但我不知道如何让它以有序的方式构建输出。这是我到目前为止的代码:

string[] lines = File.ReadAllLines(fileName);
List<string> list_lines = new List<string>(lines);

Parallel.ForEach(list_lines, async line =>
{
processedData += await processSingleLine(line);
});

正如您所看到的,它没有任何有序的实现,因为我尝试寻找适合我的解决方案的东西,但我还没有找到任何我能够接近工作的东西。
因此,最好我希望处理每一行,但按照发送每一行的顺序构建 processedData 变量,但是我确实意识到这可能超出了我当前的技能水平,所以任何建议都会很好。

编辑:在尝试阅读下面的答案后,我尝试了两种方法:

ConcurrentDictionary<int, string> result = new ConcurrentDictionary<int, string>();
Parallel.For(0, list.Length, i =>
{
// process your data and save to dict
result[i] = processData(lines[i]);
});

ConcurrentDictionary<int, string> result = new ConcurrentDictionary<int, string>();
for (var i = 0; i < lines.Length; i++)
{
result[i] = lines[i];
}
Array.Clear(lines,0, lines.Length);
Parallel.ForEach(result, line =>
{
result[line.Key] = encrypt(line.Value, key);
});

然而,两者似乎都只使用了大约 1 个核心(4 核处理器),在任务管理器中占总数的 30%,而在我实现排序之前,它在 CPU 上使用了近 80%。

最佳答案

您可以尝试使用Parallel.For而不是Parallel.ForEach。然后你就会有你的行的索引。即:

string[] lines = File.ReadAllLines(fileName);

// use thread safe collection for catching the results in parallel
ConcurrentDictionary<int, Data> result = new ConcurrentDictionary<int, Data>();

Parallel.For(0, list.Length, i =>
{
// process your data and save to dict
result[i] = processData(lines[i]);
});

// having data in dict you can easily retrieve initial order
Data[] orderedData = Data[lines.Length];
for(var i=0; i<lines.Length; i++)
{
orderedData[i] = result[i];
}

编辑:正如您问题下的评论中所说,您不能在此处使用异步方法。当您这样做时,Parallel.ForEach 将返回一堆任务,而不是结果。如果要并行化异步代码,可以使用多个 Task.Run,如下所示:

string[] lines = File.ReadAllLines(fileName);

var tasks = lines.Select(
l => Task.Run<Data>(
async () => {
return await processAsync(l);
})).ToList();

var results = await Task.WhenAll(tasks);

注意:应该可以工作,但没有检查。

关于c# - `使用 Parallel.ForEach 加速文件处理但无法按正确顺序返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32139190/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com