r - 单台笔记本电脑上 70 GB 文本文件的快速(特定)字数统计
问题描述
我有一个重 70GB 的原始文本文件,超过 1B 行不同长度,不涉及列,原始文本。
我希望扫描它并简单地计算预定义集合中每个单词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)
这很好用,而且在我的 8 核 Windows 10 16GB RAM 笔记本电脑上不到 24 小时,如果它是一次性的努力,也不算太糟糕。但时间至关重要。是否有任何解决方案涉及text,而不是表格 CSV(如data.table
's fread
),可以在一台笔记本电脑上快速完成此操作?最好是read_lines_chunked
优雅的东西。
我想到的可能的解决方案,但无法让它们与原始文本或分块一起使用:
ff
包裹bigmemory
包裹- 简单地调用命令行
system()
并计数cat file.txt | head -1000000 | grep -o "\bword\b" | wc -l
- 我有理由相信这会更快吗? - 并行化?不确定在 Windows 中是否可行。
解决方案
推荐阅读
- controller - 树枝中用于调用控制器功能的 Symfony4 按钮不起作用
- git - 为什么这个 GIT 合并不会导致冲突?
- android - 获取 FCM remoteMessage.getData().size() 大小为 0
- list - Haskell树的最左边最深节点
- swift - SwiftUI:如何在 PopupView 出现时更改内联 NavigationBar 颜色?
- css - 如何在 Angular 中的父组件的 iframe 内容中应用字体
- wordpress - 自定义徽标 img-tag 的 src 丢失且未在 Wordpress 中呈现
- android - MPAndroid Linechart 换行内容不起作用
- r - 右侧带有标签的树状图
- botframework - 如何在 MS Teams 基于搜索的消息扩展请求中配置查询的分页参数?