ищет практические решения для оптимизации скорости парсинга текста с помощью python
спросил
Изменено 11 лет, 10 месяцев назад
Просмотрено 2к раз
Необходимо проанализировать набор строк с набором регулярных выражений с разными именами.
Каждая строка проходит через каждое регулярное выражение, пока не будет найдено совпадение. Когда совпадение найдено, код должен возвращать/выдавать пары (с именем регулярное выражение, значение) для каждой строки.
Файлы имеют размер 2 ГБ и более, поэтому я ищу некоторые идеи для повышения скорости моих парсеров.
В настоящее время код выполняется через Python, но эта часть открыта для изменений. Одним из вариантов является преобразование всего в C, чтобы получить большую скорость от PCRE и более быстрый (?) ввод-вывод, но это медленный путь, который трудно поддерживать в будущем.
Я ищу практические решения, такие как:
- преобразование парсеров в более быстрый язык
- переход на китон (?)
- файл разбивается на несколько частей и выполняется поверх нескольких потоков
- Python
- разбор
- оптимизация
- анализ текста
6
Во-первых, я бы не беспокоился о переключении на другой язык. Альтернативные стратегии, скорее всего, принесут больше пользы. Механизм регулярных выражений, используемый python, в любом случае написан на C (iirc).
- «Оптимизация» регулярных выражений, если это, возможно, ваша первая задача. Как это сделать, зависит от вашего текста и выражения. Посмотрите статьи и примеры. @ThomasH также поднимает хороший вопрос.
- Самый простой способ оптимизировать регулярное выражение — удалить его; Посмотрите, есть ли возможность переключиться на другие тесты, такие как
x in y
илиline. endswith()
и т. д. - Попробуйте запустить свой код с помощью pypy. Это может дать прирост производительности без изменения кода. В вашем случае выигрыш может быть незначительным, поскольку производительность связана с производительностью ваших регулярных выражений и файла io.
- Параллельная обработка файла несколькими потоками/процессами будет наверное будет выгодно. Я бы предложил использовать один процесс для чтения файла и отправки строк в очередь, из которой извлекаются несколько процессов. Есть множество способов сделать это. Взгляните на http://effbot.org/zone/wide-finder.htm#a-multi-processor-python-solution .
Одним из важных моментов для ускорения сопоставления с образцом в Python является использование одного регулярного выражения |
, а затем примените это регулярное выражение один раз для каждой строки:
reg = re. compile(r''' (?фу) |(? бар) ''', re.VERBOSE) для строки в строке: mo = рег.поиск(строка) если мо: выход (mo.lastgroup(), mo.group(mo.lastgroup()))
1
Первое, что приходит мне в голову, это то, что вы должны использовать re.compile() для подготовки всех регулярных выражений. Но я думаю, что это уже сделано!
Еще одна вещь, которую следует учитывать, это иерархическая обработка:
В зависимости от типа вашего регулярного выражения они могут быть организованы иерархически. Таким образом, вы можете предварительно отфильтровать строки и передать их только тем регулярным выражениям, которые вам нужно проверить.
Например, если вы ищете в регулярном выражении такой тег, как «< body attr1 attr2>«, может помочь поиск в этой строке строки «body» перед проверкой, действительно ли это тег. Вы также можете искать «<» перед использованием регулярного выражения, связанного с тегом.
Также можно ускорить обработку, если объединить несколько выражений в одно и проверить соответствие. Например, заменить одиночные проверки для «{term1}» «{term2}» на «{(term1|term2)}».
Затем вы можете попытаться отфильтровать регулярное выражение, которое необходимо проверить, определив минимальную длину строки, с которой они работают.
Подобные простые вещи могут ускорить ваше приложение без переключения на другой язык или процессор.
Если возможно, вы также можете попробовать использовать многопоточность. В зависимости от загрузки процессора вы можете обрабатывать каждую вторую строку в два потока, что также может значительно ускорить обработку.
2
Зарегистрируйтесь или войдите в систему
Зарегистрируйтесь с помощью Google
Зарегистрироваться через Facebook
Зарегистрируйтесь, используя адрес электронной почты и пароль
Опубликовать как гость
Электронная почта
Требуется, но никогда не отображается
Опубликовать как гость
Электронная почта
Требуется, но не отображается
Анализ подстроки терминала
Анализ подстроки терминалаNext: Надежная прагматическая интерпретация Вверх: Синтаксический анализ Предыдущий: Восстановление после неудачного разбора
Для предложений длиннее 60 слов и для более быстрых, но менее точным разбором более коротких предложений, мы разработали методику, которую мы вызывают синтаксический анализ терминальной подстроки . Предложение сегментировать на подстроки, разбивая на запятые, союзы, относительные местоимения и некоторые экземпляры слова «это». затем анализируются подстроки, начиная с последней и работая назад. Для каждой подстроки мы пытаемся либо разобрать саму подстроку как одну из нескольких категорий или для разбора всего набора подстрок разобран как одна из этих категорий. Наилучшей такой структурой является отобранных, и для последующей обработки, что является единственным анализом разрешенная часть предложения. Категории, которые мы ищем включают главные, придаточные и относительные предложения, инфинитивы, глагол словосочетания, предложные словосочетания и именные словосочетания.
Простым примером является следующий, хотя мы не применяем техника к предложениям или к фрагментам это короткое.
Вчера президент Джордж Буш провел пресс-конференцию.
Это предложение будет разделено запятыми. Первый `провел пресс вчерашняя конференция» будет признан вице-президентом. Далее мы пытаемся разобрать как «президент», так и «президент, вице-президент». Строка «президент, вице-президент» ни за что бы не признали, а « президент» будет признан НП. Наконец, мы пытаемся разобрать как «Джордж Буш», так и «Джордж Буш, NP, VP». «Джордж Буш, НП, VP» распознается как предложение с прилагательным к подлежащему.
Этот алгоритм превосходит более очевидный алгоритм, который мы рассматривалось ранее, а именно, разбирать каждый фрагмент отдельно в слева направо, а затем попытаться собрать фрагменты вместе. Последний алгоритм потребовал бы заглянуть внутрь всех но последний из фрагментов для возможных точек крепления. Этот проблема рекомбинации частей вообще является трудностью, с которой приходится сталкиваться синтаксическими анализаторами, которые производят фразовый, а не сентенциальный анализ (например, Вайшедель и др., 1991). Однако при синтаксическом анализе терминальной подстроки в этой рекомбинации нет необходимости, так как предпочтительные анализы последующие сегменты уже доступны, когда данный сегмент анализируется.
Эффект этого метода синтаксического анализа терминальной подстроки заключается в том, чтобы дать только короткие входы в парсер, не теряя возможности получение одного синтаксического анализа для всего длинного предложения. Предположим, для Например, мы анализируем предложение из 60 слов, которое можно разбить на шесть Сегменты по 10 слов. На каждом этапе мы будем анализировать только строку от десяти до пятнадцати «слов», десять слов в сегменте плюс нетерминальные символы, доминирующие в предпочтительном анализе последующего сегменты. При анализе подстроки из 10 слов в начале предложения мы в действительности анализируется не более строки из «15 слов», покрывающей весь предложение, состоящее из 10 слов плюс нетерминальные символы покрывая лучший анализ остальных пяти подстрок. В некотором смысле, вместо того, чтобы анализировать одно очень длинное предложение, мы честно анализируем шесть короткие предложения, что позволяет избежать комбинаторного взрыва.
Хотя этот алгоритм дал нам удовлетворительные результаты в нашей опытно-конструкторские работы, ее цифры от оценки МУК-3 не выглядят хороший.