【发布时间】:2012-02-10 03:24:01
【问题描述】:
我遇到过几次这个问题,除了小问题(见下文)之外,我无法找到任何解决方案。
假设一台计算机正在运行 2+ 个 R 实例,由于 2+ 个用户或 1 个用户运行多个进程,并且一个实例执行 update.packages()。我有几次其他实例可能会被严重破坏。正在更新的包不会以任何影响计算的方式更改功能,但不知何故会出现一个大问题。
简单的解决方案(解决方案 0)是在 update.packages() 执行时终止所有 R 实例。这有2个以上的问题。首先,必须终止 R 实例。其次,人们甚至可能无法确定这些实例在哪里运行(请参阅更新 1)。
假设正在执行的代码的行为不会改变(例如,软件包更新都是有益的——它们只会修复错误、提高速度、减少 RAM 并授予独角兽),是否有某种方法可以热交换新的对其他进程影响较小的软件包版本?
在 R 之外,我还有两个候选解决方案:
解决方案 1 是使用临时库路径,然后删除旧的旧库并将新库移动到它的位置。这样做的缺点是删除 + 移动可能会导致一段时间内没有可用的内容。
解决方案 2 是使用符号链接指向库(或库层次结构),然后用指向更新包所在的新库的指针覆盖符号链接。这似乎会导致更少的程序包停机时间 - 操作系统覆盖符号链接所需的时间。这样做的缺点是在管理符号链接时需要更加小心,并且是特定于平台的。
我怀疑解决方案 #1 可以通过巧妙地使用 .libPaths() 修改为类似于 #2,但这似乎需要不调用 update.packages() 而是编写一个新的updater 找到过时的包,将它们安装到临时库,然后更新库路径。这样做的好处是,可以将现有进程限制为它启动时的.libPaths()(即,更改 R 知道的库路径可能不会传播到那些已经在运行的实例,而无需对该实例进行一些显式干预)。
更新 1. 在示例场景中,两个竞争的 R 实例位于同一台机器上。这不是必需的:据我了解更新,如果两者共享相同的库,即共享驱动器上的相同目录,那么更新仍然会导致问题,即使 R 的另一个实例在另一台机器上.因此,可能会意外杀死一个 R 进程,甚至看不到它。
【问题讨论】: