如何在R包的Makevars中获取可用物理内存并定义为变量?
在R包Makevars中获取可用物理内存的方法
核心思路
在Makevars中利用Make的$(shell)函数调用系统原生命令获取内存信息,再将其定义为预处理器宏供C++代码调用。以下分平台给出具体实现:
Linux/macOS 平台
获取总物理内存
根据系统类型选择对应命令:
# 根据系统获取总物理内存(单位:字节) ifeq ($(OS),Linux) PHYS_MEM := $(shell free -b | awk '/Mem:/{print $$2}') endif ifeq ($(shell uname),Darwin) PHYS_MEM := $(shell sysctl -n hw.memsize) endif # 将内存值定义为C++预处理器宏 PKG_CPPFLAGS += -DPHYSICAL_MEMORY=$(PHYS_MEM)
获取可用物理内存
如果需要当前剩余可用内存而非总内存:
# Linux获取可用内存(单位:字节) ifeq ($(OS),Linux) AVAIL_MEM := $(shell free -b | awk '/Mem:/{print $$7}') endif # macOS获取用户可用内存(单位:字节) ifeq ($(shell uname),Darwin) AVAIL_MEM := $(shell sysctl -n hw.usermem) endif PKG_CPPFLAGS += -DAVAILABLE_MEMORY=$(AVAIL_MEM)
Windows 平台
获取总物理内存
借助wmic命令实现,注意适配不同shell环境:
ifeq ($(OS),Windows_NT) # Git Bash/MSYS环境下的写法 PHYS_MEM := $(shell wmic computersystem get TotalPhysicalMemory /value | findstr TotalPhysicalMemory | cut -d= -f2) # 纯CMD环境下的写法(替换上面的行即可) # PHYS_MEM := $(shell for /f "tokens=2 delims==" %a in ('wmic computersystem get TotalPhysicalMemory /value') do @echo %a) endif PKG_CPPFLAGS += -DPHYSICAL_MEMORY=$(PHYS_MEM)
额外提示
- 可转换内存单位,比如将字节转为MB:Linux用
free -m | awk '/Mem:/{print $$2}',macOS用sysctl -n hw.memsize | awk '{print $$1/1024/1024}'。 - 先在终端单独执行shell命令,确认输出符合预期后再写入Makevars,避免因系统差异导致的错误。
内容的提问来源于stack exchange,提问作者Rafa
相关产品推荐
相关产品推荐

