在C#中处理“OutofMemoryException”?

时间:2013-03-12 13:20:25

标签: c#

在此代码字符串x中提供OutOfMemoryException。有没有其他方法可以在不获取OutofMemoryException的情况下解析所有文件?我试过的代码似乎没有任何问题。

有人建议让程序按文件读取文件而不是读取整个文件并将其放在一个字符串x中。

IEnumerable<string> textLines = Directory.GetFiles(@"C:\Users\karansha\Desktop\Unique_Express\", "*.*")
    .Select(filePath => File.ReadLines(filePath))
    .SelectMany(line => line);

string x = string.Join(",", textLines);
List<string> users = new List<string>();
Regex regex = new Regex(@"User:\s*(?<username>.*?)\s");
MatchCollection matches = regex.Matches(x);
foreach (Match match in matches)
{
    var user = match.Groups["username"].Value;
    if (!users.Contains(user)) users.Add(user);
}
int numberOfUsers = users.Count(name => name.Length < 15); 
Console.WriteLine("Unique_Users_Express=" + numberOfUsers);

2 个答案:

答案 0 :(得分:5)

您希望将每个文件的所有行连接在一起似乎很奇怪。假设用户名不是跨行,您可以在一个LINQ查询中以更清晰的方式执行此操作:

var regex = new Regex(@"User:\s(?<username>[^\s]+)");
var path = @"C:\Users\karansha\Desktop\Unique_Express\";
var users = Directory.GetFiles(path, "*.*")
                     .Select(file => File.ReadLines(file))
                     .SelectMany(lines => lines)
                     .SelectMany(line => regex.Matches(line).Cast<Match>())
                     .Select(match => match.Groups["username"].Value)
                     .Distinct()
                     .ToList();

int numberOfUsers = users.Count(name => name.Length < 15); 
Console.WriteLine("Unique_Users_Express=" + numberOfUsers);

希望查询的每一行都应该清楚。这将一次处理一行 - 只要你没有那么多用户,不同的用户名的简单列表不适合内存,你应该没问题。如果需要计数,您甚至不需要拨打ToList

请注意,我在经过一些实验后调整了正则表达式 - 我希望你没问题。

答案 1 :(得分:0)

试试这个:假设用户名没有转到另一行,你可以解析每一行并建立唯一的用户名。我没有尝试过改变你的代码。只是它的逻辑。

        IEnumerable<string> textLines = Directory.GetFiles(@"C:\Users\karansha\Desktop\Unique_Express\", "*.*")
                                                 .Select(filePath => File.ReadLines(filePath))
                                                 .SelectMany(line => line);

        List<string> users = new List<string>();

        textLines.ToList().ForEach(textLine =>
        {
            Regex regex = new Regex(@"User:\s*(?<username>.*?)\s");
            MatchCollection matches = regex.Matches(textLine);
            foreach (Match match in matches)
            {
                var user = match.Groups["username"].Value;
                if (!users.Contains(user)) users.Add(user);
            }
        });

        int numberOfUsers = users.Count(name => name.Length < 15);
        Console.WriteLine("Unique_Users_Express=" + numberOfUsers);