I used the bioinformatics package, Biostrings, for a similar problem a while ago. Here is short example using text lines from janeaustenr and a handful of lookup words:
require(Biostrings)
require(janeaustenr)
# create BStringSet object from book lines
tt=austen_books()$text
subj = BStringSet(tt)
# create another BStringSet from a curated set of words to locate
lookup = BStringSet(c("read","rabbit","cousin", "polite", "civil"))
# count word instances on each line with vcountPDict, then summarize
word.counts = colSums(vcountPDict(lookup, subj))
You'll have to install Biostrings through Bioconductor.
It takes a few seconds to run, but it only matches a small set of words. The example above also doesn't recognize word boundaries in the subj lines; you'd have to add spaces to the strings in lookup to ensure that a word like "read" didn't match "readily".
How large is your lookup object?