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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 23:01:11