没有处理内存异常的System.IO.out来定义List

时间:2013-04-04 12:49:34

标签: c# .net out-of-memory

目录相当大,大约2 GB。我已经定义了一个名为results的新List,它将获取所有值。

我的代码在这里:

IEnumerable<string> textLines =  
              Directory.GetFiles(@C:\Users\karansha\Desktop\watson_query\, "*.*")
                        .Select(filePath => File.ReadLines(filePath))
                        .SelectMany(line => line)
                        .Where(line => !line.Contains("appGUID: wx"))
                        .ToList();

string searchKeyword = "WX Edit Bug";
List<string> results = new List<string>();

textLines.ToList().ForEach(textLine =>
{
   if (textLine.Contains(searchKeyword))
   {
      results.Add(textLine);
   }
});

int WX_Edit = results.Count;
Console.WriteLine("WX_Edit_Api=" + WX_Edit);

1 个答案:

答案 0 :(得分:1)

不要将SelectMany / ToListReadLines一起使用,因为它会枚举所有文件行并将巨大的结果存储在内存中。您可以使用ReadLines枚举foreach,或手动使用StreamReader来逐行阅读。例如,请参阅http://msdn.microsoft.com/en-us/library/aa287535(v=vs.71).aspx

此外,如果仅计数相关,请使用递增的int值,并避免将结果存储在List<string>中。

尝试使用:

string searchKeyword = "WX Edit Bug";
int WX_Edit = Directory.GetFiles(@C:\Users\karansha\Desktop\watson_query\, "*.*")
                        .Select(filePath => File.ReadLines(filePath))
                        .SelectMany(line => line)
                        .Count(line => !line.Contains("appGUID: wx") && line.Contains(searchKeyword));