Parallel.ForEach中的内存异常

时间:2014-04-06 16:11:54

标签: c# garbage-collection task-parallel-library

我正在使用Parallel.ForEach来完成我的工作,但得到了#34; Out of Memory Exception"。

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

flist的大小为351,ab为字符串,每个大小为20kb。在某个时间,系统内存被炸毁了。

Consume返回一个字符串列表,通常在每次迭代中大约1000个字符串。

如何处理?

2 个答案:

答案 0 :(得分:2)

尝试更换:

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

这将防止创建太多线程。然后,您可以随时尝试更高的数字,看看性能是否有所改善。

答案 1 :(得分:0)

您将每个循环将整个文件读取为单个字符串两次。如果文件很大,这很可能是您的问题的根源。