PAYATHON 2026

marginaleffects 并行计算为何仍触发 future 全局变量大小超限?

数据小陈

结论

报错说明,创建 future 时,待导出的 globals 总大小超过了当时生效的上限。你设置的 9000 * 1024^2 约为 8.79 GiB,与日志中的 2.79 GiB 上限不符。仅凭这段代码无法确定原因,建议先在创建 future 的 R 会话中检查 future.globals.maxSize 的实际值。

日志还显示,导出的 globals 总大小约为 3.86 GiB,其中较大的对象包括 ...future.FUN、func 和 mfx。这意味着即使调高上限,future 仍要传递这些对象,调高上限不会减少内存占用。

先检查当前生效的上限

在调用 avg_comparisons() 前打印该选项:

getOption("future.globals.maxSize")

也可以在设置后马上检查:

options(future.globals.maxSize = 9000 * 1024^2)
getOption("future.globals.maxSize")

如果返回值不是约 9437184000,当前会话使用的值就与预期不同。应当在哪个 R 会话中运行并行计算,就在哪个会话中检查和设置该选项。也可以检查脚本或启动配置,看看是否有后续的 options(future.globals.maxSize = ...) 覆盖了设置。

排查时,可以先设置选项,再配置并行计划:

library(future.apply)

options(future.globals.maxSize = 9000 * 1024^2)
plan("multisession", workers = 8)

getOption("future.globals.maxSize")

然后重新运行原来的 marginaleffects::avg_comparisons()。如果检查结果正确,但错误信息中的上限仍是 2.79 GiB,就需要继续确认创建 future 时走的是哪条代码路径,以及会话中的其他设置是否影响了这次启动。现有日志无法判断具体是哪项设置造成的。

如果内存压力仍然过大

调高 globals 上限只会放宽启动检查,不会缩小大型对象,也不会增加可用内存。当前设置了 8 个 worker,日志又显示有多个大型 globals 被导出,因此并行进程可能需要较多内存。可以先减少 worker 数量,观察内存占用:

plan("multisession", workers = 2)

还可以检查传入模型和计算的数据中是否有不必要的大对象,并确认是否需要启用 marginaleffects_parallel_inferences 等并行设置。若内存不足,可以暂时关闭并行计算,先确认串行计算能否完成。

不要只为消除报错而无限调高 future.globals.maxSize。globals 仍需序列化并传给 worker,实际内存需求可能超过单份对象的大小。

备注:内容仅供参考。