3

製品コード リリースの 1 つから例外ログを取得しました。

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:

この特定の RegEx が問題を引き起こしていると思います。隔離された環境でテストすると、すぐにメモリが消費されます。

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

編集

私はローカルテストで間違っていました。私は大きな文字列を読み込んで、.NET Framework がめまいがするようなものを追加して、文字列操作中ではなく RegEx 中に OOM 例外を発生させていました (またはランダムに、私が言った前のものを無視してください)。

これは .NET Framework 2.0 アプリケーションです。

4

3 に答える 3

2

あなたの正規表現を見ないと、確かなことはわかりませんが、一致が遅延ではなく貪欲であるため、このような問題が発生することがあります。

正規表現エンジンは多くの情報を内部に保存する必要があり、貪欲な一致により、正規表現が 800k 文字列の大きなセクションを何度も選択することになります。

ここにこれに関する良い情報があります。

于 2009-04-07T14:18:56.607 に答える
1

あなたのアプリケーションで可能であれば、私が最初に試みることは、入力を分割することです。

そのように正規表現を適用して、ファイルを(入力がファイルの場合)行ごとに読み取ることは可能でしょうか?

CLR Profilerを見てください。使い方を学ぶには少し時間がかかるかもしれませんが、それだけの価値があります。オブジェクトが使用するメモリの量を視覚化するのに役立ちます。

于 2009-04-07T13:59:30.243 に答える
1

あなたの編集に基づいて、コードが大量のメモリを消費する文字列を作成しているように思えます。これは、メモリ不足の例外が Regex コード内から生成されたとしても、実際には Regex 自体が大量のメモリを消費しているためではないことを意味します。したがって、独自のコードで StringBuilder を使用することで問題が解決する場合は、それを行う必要があります。

于 2009-04-07T14:06:36.933 に答える