Быстрый (конкретный) подсчет слов в текстовом файле размером 70 ГБ на одном ноутбуке - PullRequest
0 голосов
/ 27 февраля 2019

У меня есть необработанный текстовый файл весом 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.
...