Domanda

Ho un registro ad eccezione di una delle uscite di codice di produzione.

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

I dati tenta di elaborare era di circa 800KB.

Nel mio test locale funziona perfettamente bene. Avete mai visto un comportamento simile, che cosa può essere la causa?

Shall ho diviso il testo prima di elaborarlo, ma ovviamente in questo caso regex potrebbe non corrispondere a causa della scissione file originale da un posto a caso.

Le mie espressioni regolari:

EDIT 2:

Credo che questo particolare RegEx è la causa del problema, quando ho provarlo in un ambiente isolato che sta mangiando la memoria immediatamente.

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

Modifica

Ero essere sbagliato con la mia prova locale. Stavo caricando una grande stringa poi aggiungendo cose ad esso che lo rende .NET Framework vertigini e poi dare un'eccezione OOM durante la regex anziché durante le operazioni di stringa (o in modo casuale, in modo da ignorare la roba precedente ho detto).

Si tratta di un'applicazione .NET Framework 2.0.

È stato utile?

Soluzione

Senza vedere il tuo Regex, non lo so per certo, ma a volte si può ottenere problemi come questo, perché le partite sono avidi invece di Lazy.

Il motore Regex deve memorizzare un sacco di informazioni internamente e partite Greedy può finire per causare il Regex per selezionare ampi settori della stringa di 800k, molte volte.

Ci sono alcune buone informazioni su questo corso qui .

Altri suggerimenti

In base a tua modifica, suona come il codice può essere la creazione di stringhe che occupano grandi quantità di memoria. Ciò significa che, anche se il fuori un'eccezione di memoria viene generata all'interno del codice Regex, in realtà non è perché il Regex in sé sta prendendo troppa memoria. Pertanto, se si utilizza StringBuilder nel proprio codice risolve il problema, allora questo è ciò che si dovrebbe fare.

La prima cosa che vorrei provare, se è possibile per la vostra applicazione, potrebbe essere quella di dividere l'ingresso.

Sarebbe possibile leggere il file (se l'ingresso è un file) linea per linea, applicando l'espressione regolare in quel modo?

Si dovrebbe dare un'occhiata con CLR Profiler . Si può prendere un po 'di tempo per imparare ad usare, ma ne vale la pena. Essa vi aiuterà a visualizzare la quantità di memoria gli oggetti utilizzano.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top