我正在尝试用R的parallel
包寻找加快将对象加载到集群中的方法:
到目前为止,我一直使用这种方法将对象加载到集群中:
# Generate cluster
cl <- parallel::makeCluster(n_threads)
# Load constants into each node's environment
parallel::clusterEvalQ(cl, expr = {
library(glmGamPoi)
NULL
})
parallel::clusterExport(cl, list('neg_binomial_fit', # Functions
'cell_attr', 'bin_size'), env = environment()) # Objects
然而,我注意到我也可以像这样将主进程中加载的库导出到集群中(这是我的下游代码的一部分),而且它加载包的速度似乎快得多(我假设是因为它只是从主进程复制库):
# Load constants into each node's environment
parallel::clusterExport(cl, list('Matrix', # Packages
'corcounts_and_calcresvar', # Functions
'cell_attr', 'min_var', 'clip_range', 'bin_size'), env = environment()) # Objects
这里我没有使用clusterEvalQ(cl, { library(package_name) })
将Matrix
包加载到每个节点(需要它,以便集群知道如何对稀疏矩阵进行子集化),而是使用clusterExport
导出加载的包。当我尝试使用glmGamPoi
的初始代码执行此操作时,由于某种原因,它不起作用,而是返回Error in get(name, envir = envir) : object 'glmGamPoi' not found
。
现在我在想Matrix
是一个独特的例子,或者glmGamPoi
隐藏在我的全局环境中,所以我不能发送它,除非通过某种特殊的方式访问它。我试过在导出它之前加载库,但也不起作用,所以我只是不知所措。我也试过其他随机包,如BiocManager
,这些也不起作用。
1条答案
按热度按时间qkf9rpyu1#
正如您在后续评论中所说,导出
"Matrix"
将导出Matrix::Matrix
对象,这将触发Matrix包被 loaded,而不是 attached。如果您在新的R会话中执行以下操作,则可以看到这一点:
然后继续:
注意矩阵只是 * 加载 *,不是 * 附加 *;
这很好;所有特定于Matrix的运算符都能正常工作,包括子集化。
因此,您可以更换:
以及
明确说明您在并行工作者中依赖于哪些包,同时清楚地表明它们不需要被 attached。