По сути, я хотел бы выполнить несколько (15-25) регулярных замен в одной строке с наилучшим возможным управлением памятью.
Обзор:
Потоковая передача только текстового файла (иногда html) через ftp с добавлением StringBuilder
для получения очень большой строки. Размер файла варьируется от 300 КБ до 30 МБ.
Регулярные выражения являются полусложными, но требуют нескольких строк файла (например, с указанием разделов книги), поэтому произвольное разбиение строки или выполнение замены в каждом цикле загрузки не подходит.
образец заменяет:
Regex re = new Regex("<A.*?>Table of Contents</A>", RegexOptions.IgnoreCase);
source = re.Replace(source, "");
При каждом запуске замены ракет памяти неба, я знаю, что это потому, что строка неизменна в C #, и ей нужно сделать копию - даже если я вызываю GC.Collect()
, это все равно недостаточно для файла 30 МБ .
Какой-нибудь совет относительно лучшего подхода или способа выполнения множественных замен регулярных выражений с использованием постоянной памяти (сделайте 2 копии (т.е. 60 МБ в памяти), выполните поиск, отбросьте копию обратно до 30 МБ)?
Обновление:
Там, кажется, не простой ответ, но для будущих людей, смотрящих на это, я использовал комбинацию всех ответов ниже, чтобы привести его в приемлемое состояние:
Если возможно, разбить строку на куски, см. Ответ manojlds, чтобы найти путь к нему при чтении файла - поиск подходящих конечных точек.
Если вы не можете разделить потоки, по крайней мере разделите их позже, если это возможно - см. Ответ ChrisWue о некоторых внешних инструментах, которые могут помочь в этом процессе для передачи файлов.
Оптимизируйте регулярное выражение, избегайте жадных операторов и постарайтесь максимально ограничить действия двигателя - см. Ответ Сильвердрага.
Объедините регулярное выражение, когда это возможно, это сокращает количество замен, когда регулярные выражения не основаны друг на друге (полезно в этом случае для очистки неверного ввода) - см. Ответ Брайана Райхла для примера кода.
Спасибо всем!