C# 并行内存不足异常。ForEach
我正在使用Parallel.ForEach来完成我的工作,但出现了“内存不足异常”C# 并行内存不足异常。ForEach,c#,garbage-collection,task-parallel-library,C#,Garbage Collection,Task Parallel Library,我正在使用Parallel.ForEach来完成我的工作,但出现了“内存不足异常” flist的大小为351,a和b是字符串,每个字符串的大小为20kb。在某个时间,系统内存崩溃 Consume返回一个字符串列表,通常在每次迭代中返回大约1000个字符串 如何处理它?每个循环将整个文件读入一个字符串两次。如果文件太大,这很可能是问题的根源。尝试替换: Parallel.ForEach(flist, (item) => { string f1 = item.Spl
flist
的大小为351,a
和b
是字符串,每个字符串的大小为20kb。在某个时间,系统内存崩溃
Consume返回一个字符串列表,通常在每次迭代中返回大约1000个字符串
如何处理它?每个循环将整个文件读入一个字符串两次。如果文件太大,这很可能是问题的根源。尝试替换:
Parallel.ForEach(flist, (item) =>
{
string f1 = item.Split('|')[0];
string f2 = item.Split('|')[1];
a = File.ReadAllText(f1);
b = File.ReadAllText(f2);
Consume(a, b);
});
与:
这将防止创建过多线程。然后,您可以尝试使用更高的数字,看看性能是否有所提高。Consume做了什么?它是内存密集型的吗?您是否查看了这篇文章:设置maxdegreeofparallelism帮助?很可能您一次创建了351个线程。每个都有一个1MB的堆栈,加上文件文本和字符串/列表等使用的内存。它可能会耗尽内存,这不是不可想象的。尝试使用
ParallelOptions.MaxDegreeOfParallelism
设置为4,看看这是否有帮助。-@Baldrick,我不知道如何在代码中添加ParallelOptions.MaxDegreeOfParallelism。你能修改我的代码吗?不,事实上我在完成了几个任务后遇到了异常。我在使用代码后遇到了另一个错误StackOverflowException。“进程因StackOverflowException而终止”。你在什么地方有递归吗?是的,消费本身是深度递归的。
Parallel.ForEach(flist, (item) =>
{
string f1 = item.Split('|')[0];
string f2 = item.Split('|')[1];
a = File.ReadAllText(f1);
b = File.ReadAllText(f2);
Consume(a, b);
});
Parallel.ForEach(flist,
new ParallelOptions { MaxDegreeOfParallelism = 4 },
(item) =>
{
string f1 = item.Split('|')[0];
string f2 = item.Split('|')[1];
a = File.ReadAllText(f1);
b = File.ReadAllText(f2);
Consume(a, b);
});