r - 未来的解决方案
问题描述
我正在处理一个大型数据集,我用它来进行某些计算。由于它是一个庞大的数据集,我正在使用的机器完成这项工作的时间过长,因此我决定使用 future 包来在多台机器之间分配工作并加快计算速度。所以,我的问题是,通过未来(使用 putty 和 ssh)我可以连接到那些机器(并行),但工作本身正在做主要的工作,没有任何分发。也许您可以提出一些解决方案:
- 如何让它在所有机器上工作;
- 同样,如何检查流程是否正常工作(我的意思是某些功能或任何可以帮助验证这些功能的功能,如果它存在的话)。
我的代码:
library(future)
workers <- c("000.000.0.000", "111.111.1.111")
plan(remote, envir = parent.frame(), workers= workers, myip = "222.222.2.22")
start <- proc.time()
cl <- makeClusterPSOCK(
c("000.000.0.000", "111.111.1.111"), user = "...",
rshcmd = c("plink", "-ssh", "-pw", "..."),
rshopts = c("-i", "V:\\vbulavina\\privatekey.ppk"),
homogeneous = FALSE))
setwd("V:/vbulavina/r/inversion")
a <- source("fun.r")
f <- future({source("pasos.r")})
l <- future({source("pasos2.R")})
time_elapsed_parallel <- proc.time() - start
time_elapsed_parallel
f 和 l 对象应该并行完成,但是主机正在完成所有工作,所以如果我能做一些关于它的事情,我有点困惑。
PS:我试过plan()
了remote, multiprocess, multisession, cluster
,没有。
PS2:我的本地机器是 Windows 并尝试连接到 Kubuntu 和 Debian(所有这些都关闭了防火墙)。
提前谢谢。
解决方案
未来的作者在这里。首先,确保您可以设置 PSOCK 集群,即通过 SSH 连接到两个 worker 并在它们上运行 Rscript。你这样做:
library(future)
workers <- c("000.000.0.000", "111.111.1.111")
cl <- makeClusterPSOCK(workers, user = "...",
rshcmd = c("plink", "-ssh", "-pw", "..."),
rshopts = c("-i", "V:/vbulavina/privatekey.ppk"),
homogeneous = FALSE)
print(cl)
### socket cluster with 2 nodes on hosts '000.000.0.000', '111.111.1.111'
(如果上述makeClusterPSOCK()
停止或不起作用,请添加参数verbose = TRUE
以获取更多信息 - 请随时在此处报告。)
接下来,随着 PSOCK 集群的设置,告诉未来的系统并行化这两个工作线程:
plan(cluster, workers = cl)
测试期货实际上是远程解决的,例如
f <- future(Sys.info()[["nodename"]])
print(value(f))
### [1] "000.000.0.000"
我暂时留下了还需要调整的剩余部分——让我们确保首先让工作人员启动并运行。
继续使用source()
并行处理会使事情复杂化,尤其是在不同机器上进行并行化时。例如,source("my_file.R")
在另一台机器上调用需要该文件my_file.R
在该机器上也可用。即使是这样,当涉及到需要导出到外部机器的变量的自动识别时,它也会使事情变得复杂。更安全的方法是将所有代码合并到主脚本中。说了这么多,你可以尝试替换:
f <- future({source("pasos.r")})
l <- future({source("pasos2.R")})
和
futureSource <- function(file, envir = parent.frame(), ...) {
expr <- parse(file)
future(expr, substitute = FALSE, envir = envir, ...)
}
f <- futureSource("pasos.r")
l <- futureSource("pasos2.R")
只要不在内部调用pasos.r
,这个 c/ 应该工作。pasos2.R
source()
顺便说一句,您使用的是哪个版本的 Windows?因为使用最新的 Windows 10,您已经内置了对 SSH 的支持,您不再需要使用 PuTTY。
更新 2018-07-31:继续回答有关source()
在期货中使用的问题。
推荐阅读
- java - 如何使用 JavaEE eclipse 将我的 React Native 应用程序连接到 MySQL 数据库?
- javascript - 如何修复硬刷新/缓存干净刷新中没有加载的数据
- python - 如何使用 Python 中的数据集使用 PSO(粒子群优化)实现聚类?
- sql - 在使用“CASE”时,是否有任何功能可以减少我的查询大小
- react-native - 是否可以从 AsyncStorage 中删除所有项目
- java - 找不到数据源 JNDI
- javascript - 从 React 中的父 JSON 数据中获取所有子节点
- php - 图像未在 Laravel 中的正确位置上传
- reactjs - 反应道具与儿童。什么时候用?
- java - Apache Ignite SQL 查询结果差异