Я имею в виду пример в документации для обработки Параллельные петли и пытаюсь адаптировать его для своего варианта использования. В моем случае на каждой независимой итерации я получаю в результате DataFrame
, который мне нужно окончательно объединить во всех итерациях, используя vcat()
. Это упрощенная версия моей попытки:
using DataFrames, Distributed
function test()
if length(workers()) < length(Sys.cpu_info())
addprocs(length(Sys.cpu_info()); exeflags = "--project = " * Base.active_project())
end
nheads = @distributed (vcat) for i = 1:20
DataFrame(a=[Int(rand(Bool))])
end
end
Но при запуске test()
я получаю сообщение об ошибке:
ERROR: On worker 2: UndefVarError: DataFrame not defined
Что мне нужно сделать, чтобы исправить это?
Ваше утверждение using DataFrames ...
в первой строке относится только к основной «цепочке». Таким образом, ваши рабочие потоки не импортировали необходимые библиотеки.
Чтобы исправить это, вы должны добавить ключевое слово @everywhere
в первую строку. Это попросит все процессы импортировать эти библиотеки.
Редактировать
Только что заметил, что вы сделали addprocs
в функции. Тогда мое предложение не сработает. Вот рабочая версия:
using Distributed
addprocs(length(Sys.cpu_info()))
@everywhere using DataFrames
function test()
nheads = @distributed (vcat) for i = 1:20
DataFrame(a=[Int(rand(Bool))])
end
end
test()
Я попробовал ваше предложение, но теперь получаю сообщение об ошибке: ошибка оценки: mod = Main, ex = @everywhere с использованием DataFrames, exception = type Ничто не имеет данных поля кадра
Хм странно. Это работает для меня. Какую версию Джулии вы используете?
Это Юлия 1.1.0. Как ни странно, это работает, когда @everywhere с использованием DataFrames запускается в REPL, но не через код выше
При дальнейшем изучении этого кода код работает до тех пор, пока DataFrames установлен в среде Julia по умолчанию (v1.1 в моем случае). Если у вас установлены DataFrames только в среде конкретного проекта, которую вы используете, это не сработает.
Другой подход к загрузке процессов в вашей среде — запустить julia следующим образом: julia --project = "path_to_environment" -e "using Distributed;addprocs(length(Sys.cpu_info()); exeflags=\"--project= \" * Base.active_project());include(\"path_to_file_to_run.jl\");" запустить файл с кодом в ответе, без строки с addprocs()