You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 00:50:23