我正在<{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();
答案 0 :(得分:1)
可能是因为您的代码每次使用时都会重新编译正则表达式?请尝试使用compiled Regex transform代替。在foreach
循环之外,存储已编译的Regex变量:
Regex compiledRegex = new Regex(@"^\d", RegexOptions.Compiled);
然后,在检查匹配时,请使用:
if (compiledRegex.IsMatch(output))
编辑:此答案无效。虽然正则表达式文档here指出实例方法中遇到的Regex表达式会被重新编译,但不情况:它们被缓存。
答案 1 :(得分:1)
这个问题不适用于正则表达式操作的错误,因为真正的错误在于最终存储在正则表达式处理周围的数据。
这个比喻正在驾驶一辆汽车并说“我打开收音机时耗尽了汽油”。这不是收音机的错......
我建议您确定为什么存储大量数据并解决此问题。
有更好的方法来处理和分析信息,而不是将所有内容丢入内存中。我相信你需要重写逻辑来实现最终目标。
为什么要收集,更重要的是保存有关6000多个文件的每一行的信息?这可能是真正的问题......
否则请主动执行这些步骤