是否存在类似tmpfs的方案可写入Ruby内存且仅在实例运行期间生效
解决方案
方案1:使用memfs gem(最贴合需求的纯内存方案)
memfs是纯Ruby实现的内存文件系统,完全兼容Ruby标准库的File、Dir类API,所有数据仅存于当前Ruby进程内存,进程退出后自动销毁,完全匹配你需要的类tmpfs效果,不需要操作系统挂载。
使用步骤:
- 安装依赖:
gem install memfs - 代码示例:
require 'memfs' require 'fileutils' # 激活Memfs后,块内所有File、Dir操作都会作用于内存文件系统 Memfs.activate do # 先创建对应的目录结构 FileUtils.mkdir_p '/ruby_tmpfs/path/to' # 你原有的写入代码不需要修改 File.write('/ruby_tmpfs/path/to/file', 'Some glorious content') # 直接调用无法修改的读文件函数即可,路径完全匹配 read_file_function_i_cannot_change_which_expects_file_path('/ruby_tmpfs/path/to/file') end # 退出块后自动恢复系统原生文件操作,内存中的文件数据会被自动销毁
如果需要全局生效不需要块包裹,直接调用Memfs.activate即可,进程结束前所有文件操作都会默认走内存文件系统。
方案2:使用系统原生tmpfs(无需安装第三方依赖)
如果不想引入第三方gem,可以直接用操作系统自带的tmpfs(Linux默认挂载在/dev/shm,macOS可手动挂载tmpfs到临时目录,大部分发行版的/tmp也默认是tmpfs挂载),只需要给当前Ruby进程创建专属临时目录,进程退出时自动清理即可:
require 'tmpdir' require 'fileutils' # 在系统tmpfs路径下创建当前进程专属的临时目录 process_tmp_root = Dir.mktmpdir(nil, '/dev/shm') # 软链映射你需要的/ruby_tmpfs路径,就可以直接用原有路径读写 FileUtils.ln_s process_tmp_root, '/ruby_tmpfs' # 原写入代码不需要修改 File.write('/ruby_tmpfs/path/to/file', 'Some glorious content') # 直接传原路径调用读文件函数即可 read_file_function_i_cannot_change_which_expects_file_path('/ruby_tmpfs/path/to/file') # 进程退出时自动清理所有临时文件和软链 at_exit do FileUtils.rm_f '/ruby_tmpfs' FileUtils.rm_rf process_tmp_root end
适用场景说明
- 如果你调用的读文件函数是纯Ruby实现,优先选择方案1,不会产生任何系统级临时文件,不会和其他进程冲突。
- 如果你调用的读文件函数会触发外部系统命令读取文件,选择方案2,外部进程可以正常访问tmpfs内的文件。
内容的提问来源于stack exchange,提问作者Jean
相关产品推荐
相关产品推荐

