R或Shiny R中高效生成可跨可视化复用的点数据缓存的问题咨询
解决方案
缓存不生效的核心原因
memoise默认基于传入函数的所有参数生成哈希缓存键,你预生成缓存时使用的df对象,和Shiny运行时加载的df对象即使内容完全一致,也会因为data.table的内部指针属性、内存地址等差异生成不同的哈希,导致缓存无法命中。
1 统一缓存键规则,实现跨场景复用
修改函数逻辑,只将稳定不变的特征作为缓存键生成依据:
library(memoise) library(cachem) library(digest) library(data.table) library(quanteda) # 预先生成语料的唯一内容哈希,语料内容不变则哈希值固定 corpus_hash <- digest(df, algo = "md5") # 改写查询函数,语料df作为全局加载对象,仅将哈希、关键词作为缓存判断参数 quanteda_kwic <- function(corpus_hash, kw) { if (length(kw) == 1) { return(as.data.table(kwic( x = df, pattern = kw, window = 300, valuetype = "fixed", separator = " ", case_insensitive = TRUE ))) } } # 初始化固定路径的磁盘缓存,所有可视化场景都指向该目录即可复用缓存 cache_dir_quanteda_kwic <- cache_disk(dir = "./shared_kwic_cache", max_size = 2 * 1024^3) # 2G缓存上限可自定义 memo_quanteda_kwic <- memoise(quanteda_kwic, cache = cache_dir_quanteda_kwic)
2 批量预生成缓存
几千个关键词可以直接批量遍历生成,也可以开多进程提升效率:
# 全量词汇列表,替换为你的完整词汇表 vocab_list <- c("bill", "period", "committee") # 单进程遍历 # for(word in vocab_list) memo_quanteda_kwic(corpus_hash, word) # 多进程并行生成(效率更高) library(furrr) plan(multisession, workers = availableCores() - 1) future_walk(vocab_list, ~memo_quanteda_kwic(corpus_hash, .x))
3 Shiny端调用方式
所有需要用到该缓存的可视化场景,都先加载同一份语料df、生成相同的corpus_hash、指向同一个缓存目录,调用时直接传入参数即可命中缓存:
# 示例:用户点击点位传入关键词后调用 selected_kw <- "government" kwic_result <- memo_quanteda_kwic(corpus_hash, selected_kw)
内容的提问来源于stack exchange,提问作者generic
相关产品推荐
相关产品推荐

