У меня есть необработанный текстовый файл весом 70 ГБ, более 1Б строк разной длины, без столбцов, необработанный текст.
Я хочу отсканировать его и просто посчитать, сколько раз каждое слово из предопределенного набора search_words
появляется (размер ~ 100).В настоящее время я использую read_lines_chunked
из пакета readr
, читая 100K кусков строк, вызывая функцию callable
f
, которая обновляет глобальный counter
, например, так:
library(tidyverse)
write_lines("cat and dog\r\ndog\r\nowl\r\nowl and cat", "test.txt")
search_words <- c("cat", "dog", "owl") # real size is about 100
counter <- numeric(length(search_words))
regex_word <- function(w) str_c("\\b", w, "\\b")
search_words <- map_chr(search_words, regex_word)
count_word <- function(i, chunk) sum(str_count(chunk, search_words[i]))
f <- function(x, pos) {
counter <<- counter + map_int(1:length(search_words), count_word, x)
}
read_lines_chunked("test.txt", SideEffectChunkCallback$new(f), chunk_size = 100000)
Это прекрасно работает, и менее чем за 24 часа на моем 8-ядерном ноутбуке с Windows 10 и 16 ГБ ОЗУ не так уж плохо, если это одноразовое усилие.Но время имеет существенное значение.Существуют ли какие-либо решения, включающие текст , а не таблицы CSV (например, data.table
fread
), чтобы сделать это быстро на одном ноутбуке?Желательно что-то с элегантностью read_lines_chunked
.
Возможные решения, о которых я думал, но не смог заставить их работать с необработанным текстом или с чанкингом:
ff
пакет bigmemory
package - , просто вызывая командную строку через
system()
и считая с cat file.txt | head -1000000 | grep -o "\bword\b" | wc -l
- есть ли у меня основания полагать, что это будет быстрее? - распараллеливание?Не уверен, если это возможно в Windows.