У меня была задача обработать большие rtf файлы,> 500Мб. Мне нужно было найти и извлечь части из этих больших файлов.
Это был рабочий прототип, написанный на Java, для демонстрационных целей.
Я создал регулярное выражение, которое работало для небольших файлов rtf (~ 10Мб) и пыталось применить это выражение для огромных файлов.
И я получаю ошибку "Переполнение стека" при выполнении этого регулярного выражения.
Насколько я понимаю, регулярные выражения имеют рекурсивный характер, и это причина исключения, которое я получаю. На небольших файлах регулярное выражение работало хорошо и быстро.
Правильно ли я понимаю причину?
Нет: регулярные выражения не имеют рекурсивного характера. Любой достойный язык просто преобразует такое выражение в конечный конечный автомат. Это означает, что для фильтрации файла размером 10 мегабайт или 500 мегабайт требуется такой же объем памяти (и, как следствие, размер стека). Кроме того, он масштабируется линейно по времени: можно ожидать, что в 50 раз больше времени, чтобы фильтровать файл размером 500 мегабайт, чем один из 10 MiB.
Что вы используете оценщик регулярных выражений? Для файлов grep
/sed
меньшие или большие файлы не являются проблемой.