使用Regex的C#OutofMemoryException

时间:2016-04-13 12:23:12

标签: c# regex exception out-of-memory

我正在<{1}}

OutOfMemoryException

但是我不确定是什么导致它,我的程序运行了4分钟。阅读文本文件(很多)。批量插入SQL。当时的输出字符串没有任何特殊内容,从if (Regex.IsMatch(output, @"^\d"))文件中读取一个小文本。

我假设这种情况正在发生,因为需要进行正则表达式检查的次数,4分钟之后就是百万次。有没有办法防止内存问题?在开始循环之前处理或清除?如果是这样你怎么样?

修改 我不是在读大文件,我正在阅读很多文件。当它失败时,它已经读了大约6666个文件(5个文件夹),但它总共需要读取60个文件夹 - &gt; 80.361 .txt文件

修改 添加了源代码。希望澄清

更新

加入: static void DisposeAll(IEnumerable set)

.txt

我正在文件夹的每个循环结束时执行此操作。

static void DisposeAll(IEnumerable set)
{
    foreach (Object obj in set)
    {
        IDisposable disp = obj as IDisposable;
        if (disp != null) { disp.Dispose(); }
    }
}

错误放置已更改,不再是Regex,而是ListFouten现在正在导致它。 仍然发生在大约6666 .txt文件读取。

  

抛出了类型'System.OutOfMemoryException'的异常。

DisposeAll(ListExtraInfo);
DisposeAll(ListFouten);
ListFouten.Clear();
ListExtraInfo.Clear();

2 个答案:

答案 0 :(得分:1)

可能是因为您的代码每次使用时都会重新编译正则表达式?请尝试使用compiled Regex transform代替。在foreach循环之外,存储已编译的Regex变量:

Regex compiledRegex = new Regex(@"^\d", RegexOptions.Compiled);

然后,在检查匹配时,请使用:

if (compiledRegex.IsMatch(output))

编辑:此答案无效。虽然正则表达式文档here指出实例方法中遇到的Regex表达式会被重新编译,但情况:它们被缓存。

答案 1 :(得分:1)

这个问题不适用于正则表达式操作的错误,因为真正的错误在于最终存储在正则表达式处理周围的数据

这个比喻正在驾驶一辆汽车并说“我打开收音机时耗尽了汽油”。这不是收音机的错......

我建议您确定为什么存储大量数据并解决此问题。

有更好的方法来处理和分析信息,而不是将所有内容丢入内存中。我相信你需要重写逻辑来实现最终目标。

为什么要收集,更重要的是保存有关6000多个文件的每一行的信息?这可能是真正的问题......

否则请主动执行这些步骤