Регулярное выражение для огромного блока данных

1

У меня была задача обработать большие rtf файлы,> 500Мб. Мне нужно было найти и извлечь части из этих больших файлов.

Это был рабочий прототип, написанный на Java, для демонстрационных целей.

Я создал регулярное выражение, которое работало для небольших файлов rtf (~ 10Мб) и пыталось применить это выражение для огромных файлов.

И я получаю ошибку "Переполнение стека" при выполнении этого регулярного выражения.

Насколько я понимаю, регулярные выражения имеют рекурсивный характер, и это причина исключения, которое я получаю. На небольших файлах регулярное выражение работало хорошо и быстро.

Правильно ли я понимаю причину?

  • 3
    Нам нужно увидеть ваше регулярное выражение с некоторыми примерами данных, чтобы лучше понять его.
  • 2
    Вы используете язык или текстовый редактор? FWIW, если текстовый редактор EditPad Pro от гуру регулярных выражений Ян Гойваертс имеет замечательное регулярное выражение и обрабатывает файлы в гигабайтах.
Показать ещё 5 комментариев
Теги:

1 ответ

0
Лучший ответ

Нет: регулярные выражения не имеют рекурсивного характера. Любой достойный язык просто преобразует такое выражение в конечный конечный автомат. Это означает, что для фильтрации файла размером 10 мегабайт или 500 мегабайт требуется такой же объем памяти (и, как следствие, размер стека). Кроме того, он масштабируется линейно по времени: можно ожидать, что в 50 раз больше времени, чтобы фильтровать файл размером 500 мегабайт, чем один из 10 MiB.

Что вы используете оценщик регулярных выражений? Для файлов grep/sed меньшие или большие файлы не являются проблемой.

  • 0
    Я использовал регулярное выражение в своем Java-коде, чтобы сделать быстрый-грязный рабочий прототип для демонстрационных целей.
  • 0
    Но тогда вы можете показать нам регулярное выражение и уверены, что оно как-то связано с регулярным выражением. Кроме того, конечно, регулярное выражение должно быть синтаксически правильным.
Показать ещё 4 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню