Как ускорить поиск текста в R?

У меня большой текстовый вектор, который я хотел бы найти для конкретного символа или фразы. Регулярные выражения берутся навсегда. Как мне быстро его найти?

Пример данных:

R <- 10^7
garbage <- replicate( R, paste0(sample(c(letters[1:5]," "),10,replace=TRUE),collapse="") )

2 ответа

Решение

Если вам нужны регулярные выражения, вы, как правило, можете повысить производительность по сравнению с механизмом регулярных выражений по умолчанию, используя библиотеку PCRE (установив perl=TRUE). Есть другие советы по производительности в ?grep:

Вопросы производительности:

Если вы выполняете много совпадений с регулярными выражениями, в том числе с очень длинными строками, вам следует рассмотреть используемые параметры. Обычно PCRE будет быстрее, чем стандартный движок регулярных выражений, и "fixed = TRUE" все еще быстрее (особенно, если каждый шаблон сопоставляется только несколько раз).

Если вы работаете в однобайтовой локали и отметили строки UTF-8, которые представимы в этой локали, сначала преобразуйте их, так как только одна строка UTF-8 заставит все сопоставления выполняться в Unicode, что влечет за собой штраф в размере около 3х для режима POSIX 1003.2 по умолчанию.

Если вы можете использовать 'useBytes = TRUE', строки не будут проверены перед сопоставлением, и фактическое сопоставление будет быстрее. Часто в языке UTF-8 достаточно сопоставления на основе байтов, поскольку шаблоны байтов одного символа никогда не совпадают с частью другого.

Здесь нет необходимости в регулярных выражениях, а их мощность сопряжена с вычислительными затратами.

Вы можете отключить синтаксический анализ регулярного выражения в любой из функций регулярного выражения в R с помощью ,fixed=TRUE аргумент. Результат увеличения скорости:

library(microbenchmark)
m <- microbenchmark( 
    grep( " ", garbage, fixed=TRUE ),
    grep( " ", garbage )
)
m
Unit: milliseconds
                             expr       min        lq   median        uq      max neval
 grep(" ", garbage, fixed = TRUE)  491.5634  497.1309  499.109  503.3009 1128.643   100
               grep(" ", garbage) 1786.8500 1801.9837 1810.294 1825.2755 3620.346   100
Другие вопросы по тегам