Дополнение к проблеме (Админам: если она не заслуживает отдельного ответа - пожалуйста, объедините ее с исходной). Причина, по которой mgsub
работала так быстро по сравнению с простым циклом for, заключалась в том, что в mgsub
параметр fixed = TRUE
по умолчанию, а в gsub
по умолчанию FALSE
! Я только что обнаружил это. Хочу еще раз уточнить, что fixed=TRUE
мне не подходит, так как я не хочу заменять caps
в capsule
, а только все слово caps
. т.е. Я вынужден вставить \\b
s в шаблон. Вот три фрагмента моего кода (я протестировал fixed=TRUE
в gsub
просто чтобы увидеть разницу во времени, не собираюсь его использовать).
#This is with mgsub. Now with fixed = FALSE!!
i = mgsub(paste("\\b",orig,"\\b",sep=""),change,i,fixed=FALSE)
#This is with a for loop. fixed=TRUE in one of lines is for test purposes only. Do not use
for(k in seq_along(orig)) {
i = gsub(paste("\\b",orig[k],"\\b",sep=""),change[k],i)
#i = gsub(orig[k],change[k],i,fixed=TRUE)
}
Вот время и использование памяти для всех трех случаев с разным количеством входных данных:
N | mgsub, fixed=F | gsub, fixed=F | gsub, fixed=T
--------------------------------------------------------------
100k | 41sec, M > 2.3GB | 37sec, M > 0.9GB | 9sec, M > 0.8GB
200k | 99sec, M > 4GB | 74sec, M > 1.1GB | 18sec, M > 1.3GB
300k | 132sec, M > 5.6GB| 112sec, M > 2.6GB| 28sec, M > 1.6GB
+ disk involved
Таким образом, я заключаю, что для моего приложения, когда fixed
должно быть FALSE
, нет никаких преимуществ использования mgsub
. На самом деле цикл for
работает быстрее и не вызывает переполнения памяти!
Спасибо всем причастным. Я хотел бы отдать должное комментаторам, но я не знаю, как это сделать в «Комментариях».
person
Alexey Ferapontov
schedule
09.12.2014
for(i in seq_along(e)) line <- gsub(e[i], f[i], line, fixed = TRUE)
. Это должно работать, если элементыe
не являются подстрокамиf
. - person G. Grothendieck   schedule 09.12.2014fixed=TRUE
. Это может немного ускорить. - person G. Grothendieck   schedule 09.12.2014sub
вместоgsub
при условии, что может быть не более одного вхождения любого компонентаe
в любой компонентline
. Еще одна возможность состоит в том, чтобы обрабатывать болееk
компонентовline
в то время, когда правильно выбрано целое числоk
:n <- length(line); g <- gl(n, k, n); for(lv in levels(g)) { ok <- lv == seq_along(line); line[ok] <- mgsub(e, f, line[ok]) }
. - person G. Grothendieck   schedule 09.12.2014fixed = TRUE
вgsub
, так как замена может быть частью большего слова, что недопустимо (например,e = "caps"
,line = "capsule"
- заглавные буквы в строке будут заменены каким-либо символом из r) - я должен использовать\\be\\b
. Есть ли способ обойти это, то есть использовать fixed=T и сопоставлять только целые слова? - person Alexey Ferapontov   schedule 09.12.2014mgsub
, чтобы использовать внутренний циклfor
. Это сделает его более быстрым и менее проблематичным с проблемами памяти. github.com/trinker/qdap/issues/201 - person Tyler Rinker   schedule 18.12.2014gsub
сfixed=T
будет работать немного быстрее, но теперь у нас есть альтернатива, когда скорость менее важна, а важнее компактный векторизованный код - person Alexey Ferapontov   schedule 18.12.2014