gpt4 book ai didi

.net - 处理大文件时正则表达式匹配中的 OutOfMemoryException

转载 作者:行者123 更新时间:2023-12-03 02:02:31 29 4
gpt4 key购买 nike

我从某个生产代码版本中获得了异常日志。

System.OutOfMemoryException: Exception of type 'System.OutOfMemoryException' was thrown.
at System.Text.RegularExpressions.Match..ctor(Regex regex, Int32 capcount, String text, Int32 begpos, Int32 len, Int32 startpos)
at System.Text.RegularExpressions.RegexRunner.InitMatch()
at System.Text.RegularExpressions.RegexRunner.Scan(Regex regex, String text, Int32 textbeg, Int32 textend, Int32 textstart, Int32 prevlen, Boolean quick)
at System.Text.RegularExpressions.Regex.Run(Boolean quick, Int32 prevlen, String input, Int32 beginning, Int32 length, Int32 startat)
at System.Text.RegularExpressions.MatchCollection.GetMatch(Int32 i)
at System.Text.RegularExpressions.MatchEnumerator.MoveNext()

它尝试处理的数据约为 800KB。

在我的本地测试中,它工作得很好。您是否见过类似的行为,原因是什么?

我应该在处理文本之前分割文本吗?但显然在这种情况下,正则表达式可能不匹配,因为原始文件是从随机位置分割的。

我的正则表达式:

编辑 2:

我认为这个特定的正则表达式导致了这个问题,当我在隔离环境中测试它时,它立即消耗了内存。

((?:( |\.\.|\.|""|'|=)[\/|\?](?:[\w#!:\.\?\+=&@!$'~*,;\/\(\)\[\]\-]|%[0-9a-f]{2})*)( |\.|\.\.|""|'| ))?

编辑

我的本​​地测试出错了。我加载了一个大字符串,然后向其中添加一些内容,这使得 .NET Framework 头晕目眩,然后在 RegEx 期间而不是在字符串操作期间给出 OOM 异常(或随机,因此请忽略我之前所说的内容)。

这是一个 .NET Framework 2.0 应用程序。

最佳答案

如果没有看到你的正则表达式,我不确定,但有时你会遇到这样的问题,因为你的匹配是贪婪的而不是懒惰的。

正则表达式引擎必须在内部存储大量信息,而贪婪匹配最终可能会导致正则表达式多次选择 800k 字符串的大部分。

here 有一些关于此的好信息。 .

关于.net - 处理大文件时正则表达式匹配中的 OutOfMemoryException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/725817/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com