Как ускорить поиск текста в 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