我正在使用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,a
和b
为字符串,每个大小为20kb。在某个时间,系统内存被炸毁了。
Consume返回一个字符串列表,通常在每次迭代中大约1000个字符串。
如何处理?
答案 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)
您将每个循环将整个文件读取为单个字符串两次。如果文件很大,这很可能是您的问题的根源。