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

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

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

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

Ответ 1

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

Показатели производительности:

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

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

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

Ответ 2

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

Вы можете отключить разбор регулярного выражения в любой из функций регулярного выражения в 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