Я сталкивался с этой проблемой несколько раз и не могу найти никакого решения, кроме тривиального (см. Ниже).
Предположим, на компьютере запущено 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 и даже не увидеть его.