R bigmemory如何在脚本执行后保留共享内存中的矩阵并支持访问
解决方案
bigmemory的纯内存共享矩阵默认会在创建它的R进程退出时,随垃圾回收自动销毁对应的共享内存段,以下是3种比Sys.sleep更实用的方案:
优先选择file-backed持久化共享矩阵
这是生产环境最常用的方案,矩阵数据会持久化存储在磁盘的二进制文件中,共享内存仅作为缓存使用,进程退出不会删除数据,重启设备后也可以直接复用,无需重新读取原始文本文件。
修改后代码示例:library(bigmemory) m <- read.big.matrix( "matrix.txt", type = 'double', shared = TRUE, header = FALSE, sep = "\t", # 配置持久化参数:磁盘存储文件名、存储路径、描述文件路径 backingfile = "matrix_data.bin", backingpath = "./", descriptorfile = "matrix.signature" )其他R会话直接调用
attach.big.matrix("matrix.signature")即可加载矩阵,性能和纯内存模式差异极小。手动关闭自动销毁共享内存的逻辑
如果你确实不需要持久化到磁盘,只想使用纯内存共享,可以调用bigmemory的内部方法关闭进程退出时的自动清理逻辑,无需挂起原进程:
代码示例:library(bigmemory) m = read.big.matrix("matrix.txt", type='double', shared = TRUE, header = FALSE, sep = "\t") # 关闭该共享内存段的自动删除开关 bigmemory:::set.file.remove(m@address, FALSE) sign = describe(m) dput(sign, "matrix.signature")注意:该方案需要你手动管理内存生命周期,不再使用时需主动清理共享内存段,避免出现内存泄漏。
用系统服务托管原进程
如果你不想修改现有代码,可以把加载矩阵的R脚本注册为系统服务(Linux下用systemd、Windows下用服务管理器),配置为开机自启、崩溃自动重启,比手动添加Sys.sleep更稳定,也方便统一管理进程的启停。
内容的提问来源于stack exchange,提问作者Matthias Munz
相关产品推荐
相关产品推荐

