Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 并行内存不足异常。ForEach_C#_Garbage Collection_Task Parallel Library - Fatal编程技术网

C# 并行内存不足异常。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

我正在使用Parallel.ForEach来完成我的工作,但出现了“内存不足异常”

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);
    });