Я сталкивался с этой проблемой несколько раз и не могу найти ни одного решения, кроме тривиального (см. Ниже).
Предположим, что на компьютере запущено более 2 экземпляров R из-за2+ пользователя или 1 пользователь, выполняющий несколько процессов, и один экземпляр выполняет update.packages()
.У меня было несколько раз, когда другой экземпляр мог запутаться.Обновляемые пакеты никоим образом не изменяют функциональность, которая влияет на вычисления, но почему-то возникает большая проблема.
Тривиальное решение (Решение 0) - завершить все экземпляры R, пока выполняется update.packages()
.Это имеет 2+ проблемы.Сначала нужно завершить R экземпляров.Во-вторых, можно даже не определить, где запущены эти экземпляры (см. Обновление 1).
Предполагая, что поведение исполняемого кода не изменится (например, обновления пакетов полезны - они толькоисправлять ошибки, улучшать скорость, уменьшать объем оперативной памяти и предоставлять единорогов), есть ли способ горячей замены новой версии пакета с меньшим влиянием на другие процессы?
У меня есть еще два варианта решения, кроме R:
Решение 1 - использовать временный путь к библиотеке, а затем удалить старую старую библиотеку и переместить новую на место.Недостатком этого является то, что удаление + ходы может занять некоторое время, в течение которого ничего не доступно.
Решение 2 - использовать символические ссылки для указания на библиотеку (или иерархию библиотеки) и просто перезаписать символическую ссылку указателем нановая библиотека, в которой находится обновленный пакет.Похоже, это приводит к еще меньшему времени простоя пакетов - времени, которое требуется ОС для перезаписи символической ссылки.Недостатком этого является то, что он требует гораздо большего внимания при управлении символическими ссылками и зависит от платформы.
Я подозреваю, что решение № 1 можно изменить так, чтобы оно было похоже на # 2, путем умного использования .libPaths()
, но кажется, что нужно не вызывать update.packages()
и вместо этого написать новый модуль обновления, который находит устаревшие пакеты, устанавливает их во временную библиотеку, а затем обновляет пути к библиотекам.Преимуществом этого является то, что можно ограничить существующий процесс до .libPaths()
, который был у него при запуске (т. Е. Изменение путей к библиотекам, о которых знает R, может не распространяться на те экземпляры, которые уже запущены, без какого-либо явного вмешательства в этом экземпляре).).
Обновление 1. В примере сценария два конкурирующих экземпляра R находятся на одном компьютере.Это не является обязательным требованием: насколько я понимаю обновления, если эти две библиотеки используют одни и те же библиотеки, то есть одни и те же каталоги на общем диске, обновление может по-прежнему вызывать проблемы, даже если другой экземпляр R находится на другом компьютере.,Таким образом, можно случайно убить процесс R и даже не увидеть его.