一张数据表能塞进电脑,不等于模型就跑得完。R 在计算时还会复制、转换数据,并保存中间结果;交叉验证——把数据反复分组训练和检验——尤其容易让内存悄悄膨胀。于是任务可能运行许久后才报错,甚至被操作系统直接终止。
JottR on R 用 cv.glmnet(x, y) 举例:它会对设计矩阵 x 做交叉验证的 Elastic net——一种会压缩不重要特征系数的回归方法。作者根据初步测量和代码检查估计,运行时除 x 本身外,还需约为 x 大小 3 至 4 倍的内存。一张 25 万行、1000 列、约 1.9 GiB 的矩阵,因此远不是准备 1.9 GiB 就够。其设想是在普通 R 代码旁声明 memory(4 * object.size(x)):开跑前先检查,内存不足就立即失败;并行执行时,调度框架还能据此决定同时运行多少个任务。
这套 Resource Project 目前主要是实验构想和未来计划,所示功能除已在 CRAN 发布的 futurize() 外尚未实现;4 倍内存也只是作者为简化讨论采用的粗略模型。它值得注意之处,是把“多试几次才知道会不会爆内存”改成可检查、可调度的资源预算。