我正在尝试使用 Julia 将一组不同的线性混合模型拟合到使用 pmap 的同一数据集(Mac OSX 12.6.3,Julia 1.9)。我可以成功拟合线性混合模型并使用本机函数运行 pmap,例如
pmap(sqrt, 1:100)
。我编写了一个名为 fit_mm
的函数,它接受一个引用数据集列的字符串、要更新的基本公式以及名为 df
的数据集作为输入。我可以使用 map
成功运行它。但是,当我尝试使用 pmap 时,出现以下错误。
julia> # Run map
pmap(x -> fit_mm(x, baseFormula, df), covs[1:10])
ERROR: On worker 3:
KeyError: key StatsModels [3eaba693-59b7-5ba5-a881-562e759f1c8d] not found
这是我正在使用的汇总代码
using Distributed
@everywhere using MixedModels
@everywhere using DataFrames
@everywhere using DataFramesMeta
@everywhere using CategoricalArrays
@everywhere using CSV
@everywhere using Term
@everywhere using StatsModels
@everywhere using DelimitedFiles
addprocs(2)
# Function to update formula
@everywhere begin
function fit_mm(testVar, f, data)
....
end
end
# Load data of interest...
# Run map
pmap(x -> fit_mm(x, baseFormula, df), covs) # covs is the list of variables I want to use to modify baseFormula and df is the data
我很抱歉这次没有提供可重现的示例。下次我提问时我会确保这样做。无论如何,我只是想让每个可能读到这篇文章的人知道我解决了这个问题,希望它可以帮助别人。当我关闭和/或重新启动 Julia 时,我注意到出现问题的工作程序中的错误消息不断变化(我有四个工作程序,有时错误分配给工作程序 2,有时分配给工作程序 3,依此类推) )以及未找到的包。我最终发现,如果 addprocs(2) 命令创建了工作程序,那么我应该在声明使用包或函数之前创建工作程序,以便可以将包和函数加载到所有工作程序中。因此,我在声明使用分布式包后立即移动了 addprocs 语句。所以最终的代码是
using Distributed
addprocs(2)
@everywhere using MixedModels
@everywhere using DataFrames
@everywhere using DataFramesMeta
@everywhere using CategoricalArrays
@everywhere using CSV
@everywhere using Term
@everywhere using StatsModels
@everywhere using DelimitedFiles
... and then the rest of the code.
这导致代码运行没有问题。
是的...需要打开所有的worker,以便在那里定义功能!谢谢你。