Frage

Ich habe ein Ausnahmeprotokoll von einem Produktionscode Releases bekomme.

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()

Die Daten, die es versucht, war etwa 800 KB zu verarbeiten.

In meinem lokalen Test arbeitet es völlig in Ordnung. Haben Sie schon einmal ein ähnliches Verhalten gesehen, was die Ursache sein?

Soll ich teilen den Text, bevor sie die Verarbeitung, aber offensichtlich in diesem Fall regex könnte, weil die ursprüngliche Datei Trennung von einem zufälligen Ort nicht überein.

Mein Regexes:

EDIT 2:

Ich denke, diese besondere RegEx das Problem verursacht, als ich es in einer isolierten Umgebung testen sie die Erinnerung sofort isst.

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

Bearbeiten

ich wäre falsch mit meinem lokalen Test. Ich war ein große String Laden bis dann Sachen, um es anhängen, die .NET Framework schwindlig wird und dann eine OOM Ausnahme während des RegEx geben statt während String-Operationen (oder zufällig, so ignorieren Sie die vorherigen Sachen, die ich gesagt habe).

Dies ist eine .NET Framework 2.0-Anwendung.

War es hilfreich?

Lösung

Ohne Ihre Regex zu sehen, ich weiß nicht sicher, aber manchmal kann man Probleme wie diese erhalten, weil Ihre Spiele Greedy statt faul sind.

Die Regex-Engine hat intern viele Informationen zu speichern und Greedy Spiele kann das verursacht die Regex Ende große Teile Ihrer 800k Schnur, ein Vielfaches wählen.

Es gibt einige gute Informationen über diese über hier .

Andere Tipps

Auf der Basis Ihrer bearbeiten, es klingt wie der Code-Strings zu schaffen sein, die große Mengen an Speicherplatz. Dies würde bedeuten, dass, obwohl die aus der Erinnerung Ausnahme von innerhalb der Regex Code generiert wird, ist es nicht wirklich, weil die Regex selbst zu viel Speicher einnehmen. Deshalb, wenn String in Ihrem eigenen Code das Problem löst, dann ist das, was Sie tun sollen.

Das erste, was ich versuchen würde, wenn es für Ihre Anwendung möglich ist, wäre die Eingabe aufzuteilen.

Wäre es möglich, die Datei zu lesen line-by-line (wenn die Eingabe eine Datei ist), auf diese Weise den regulären Ausdruck anwenden?

Sie sollten einen Blick mit nehmen CLR Profiler . Es kann eine wenig Zeit in Anspruch nehmen zu lernen, wie zu verwenden, aber es lohnt sich. Es hilft Ihnen, visualisieren, wie viel Speicher Ihre Objekte verwenden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top