如何用readRDS读取memoise缓存的.rds文件?哈希匹配问题求助
解决memoise/cachem缓存文件哈希匹配问题的可行方案
方案1:复现memoise的缓存键生成逻辑
memoise生成缓存文件名的哈希并非直接调用rlang::hash,而是结合函数指纹与参数哈希,最终用digest::digest生成。你可以直接复用memoise内部的工具函数生成正确的键:
library(memoise) library(digest) # 1. 定义与原函数完全一致的函数(需保证函数体、依赖环境和创建fun.memo时完全相同) fun <- function(arg1, arg2) { # 原函数的逻辑代码 } # 2. 生成函数指纹(memoise用来标识函数唯一性的哈希) func_fingerprint <- memoise:::fingerprint(fun) # 3. 生成调用参数的哈希(替换为你需要匹配的实际参数列表) target_args <- list(arg1 = 123, arg2 = "test") args_hash <- memoise:::hash_args(target_args) # 4. 组合生成最终缓存键 cache_key <- digest::digest(list(func_fingerprint, args_hash), algo = "sha1") # 读取对应缓存文件 target_file <- file.path("你的缓存目录路径", paste0(cache_key, ".rds")) result <- readRDS(target_file)
方案2:直接遍历缓存文件解析元数据
cachem的磁盘缓存文件不仅存储结果,还包含调用参数、函数指纹等元数据。你可以直接读取所有缓存文件,提取信息后匹配目标结果:
# 设置缓存目录路径 cache_dir <- "你的缓存目录路径" cache_files <- list.files(cache_dir, pattern = "\\.rds$", full.names = TRUE) # 遍历所有缓存文件,构建参数与结果的映射 cache_map <- lapply(cache_files, function(file) { obj <- readRDS(file) list(args = obj$extra$args, result = obj$value, key = obj$key) }) # 根据目标参数筛选结果 target_args <- list(arg1 = 123, arg2 = "test") target_result <- Filter(function(x) identical(x$args, target_args), cache_map)[[1]]$result
方案3:用cachem API直接读取缓存
如果你知道缓存目录的路径,直接创建cachem磁盘缓存对象,用内置方法读取:
library(cachem) # 创建与之前一致的磁盘缓存对象 disk_cache <- cache_disk(path = "你的缓存目录路径") # 获取所有缓存键 all_keys <- disk_cache$keys() # 遍历键匹配目标参数并读取结果 target_result <- NULL target_args <- list(arg1 = 123, arg2 = "test") for (key in all_keys) { obj_meta <- disk_cache$get(key, include_value = FALSE) # 先读取元数据,不加载结果 if (identical(obj_meta$extra$args, target_args)) { target_result <- disk_cache$get(key) break } }
关键注意事项
- 函数指纹依赖函数的定义内容和绑定环境,如果原函数的环境或代码有变更,指纹会变化,导致缓存键不匹配。
- memoise默认使用
sha1哈希算法,不要用其他算法替代。
内容的提问来源于stack exchange,提问作者Abdirizak
相关产品推荐
相关产品推荐

