基本软件包parallel允许通过派生,套接字和随机数生成进行并行计算。
检测本地主机上存在的核心数:
parallel::detectCores(all.tests = FALSE, logical = TRUE)
在本地主机上创建核心集群:
parallelCluster <- parallel::makeCluster(parallel::detectCores())
首先,必须创建适合并行化的功能。考虑mtcars数据集。回归上mpg可以通过创建一个单独的回归模型的每一级加以改进cyl。
data <- mtcars yfactor <- 'cyl' zlevels <- sort(unique(data[[yfactor]])) datay <- data[,1] dataz <- data[,2] datax <- data[,3:11] fitmodel <- function(zlevel, datax, datay, dataz) { glm.fit(x = datax[dataz == zlevel,], y = datay[dataz == zlevel]) }
创建一个可以遍历的所有可能迭代的函数zlevels。这仍然是串行的,但是是重要的一步,因为它确定了将要并行化的确切过程。
fitmodel <- function(zlevel, datax, datay, dataz) { glm.fit(x = datax[dataz == zlevel,], y = datay[dataz == zlevel]) } for (zlevel in zlevels) { print("*****") print(zlevel) print(fitmodel(zlevel, datax, datay, dataz)) }
咖喱这个功能:
worker <- function(zlevel) { fitmodel(zlevel,datax, datay, dataz) }
使用的并行计算parallel无法访问全局环境。幸运的是,每个函数创建一个parallel可以访问的本地环境。包装函数的创建允许并行化。还需要将要应用的功能放在环境中。
wrapper <- function(datax, datay, dataz) { # force evaluation of all paramters not supplied by parallelization apply force(datax) force(datay) force(dataz) # these variables are now in an enviroment accessible by parallel function # function to be applied also in the environment fitmodel <- function(zlevel, datax, datay, dataz) { glm.fit(x = datax[dataz == zlevel,], y = datay[dataz == zlevel]) } # calling in this environment iterating over single parameter zlevel worker <- function(zlevel) { fitmodel(zlevel,datax, datay, dataz) } return(worker) }
现在创建一个集群并运行包装函数。
parallelcluster <- parallel::makeCluster(parallel::detectCores()) models <- parallel::parLapply(parallelcluster,zlevels, wrapper(datax, datay, dataz))
完成后,请始终停止集群。
parallel::stopCluster(parallelcluster)
该parallel软件包包括整个apply()家族,并以开头par。
当我使用Spring批处理管理运行长时间运行的批处理作业的多个实例时,它会在达到jobLauncher线程池任务执行程序池大小后阻止其他作业运行。但是从cron中提取多个工作似乎效果不错。下面是作业启动器配置。 Spring批处理管理员Restful API是否使用不同于xml配置中指定的作业启动器?
只要需要并行的程序逻辑可以划分为不同的职责,并分配给各个独立的step,那么就可以在单个进程中并行执行。并行Step执行很容易配置和使用,例如,将执行步骤(step1,step2)和步骤3step3并行执行,则可以向下面这样配置一个流程: <job id="job1"> <split id="split1" task-executor="taskExecutor" next="step4"
问题内容: 给出以下代码: 我可以假设’dowork’函数将并行执行吗? 这是实现并行性的正确方法,还是对每个goroutine使用通道并将单独的“ workwork”工人分开更好? 问题答案: 关于GOMAXPROCS,您可以在Go 1.5的发行文档中找到: 默认情况下,Go程序在将GOMAXPROCS设置为可用内核数的情况下运行;在以前的版本中,它默认为1。 关于防止main功能立即退出,您可
问题内容: 什么是在python 2.7中进行并行处理的简单代码?我在网上找到的所有示例都是令人费解的,其中包括不必要的代码。 我如何做一个简单的蛮力整数分解程序,在其中我可以在每个核(4)上分解一个整数?我的真实程序可能只需要2个内核,并且需要共享信息。 我知道并存python和其他库,但是我想将使用的库数保持最少,因此我想使用和/或库,因为它们是python附带的 问题答案: 从python中
我目前正在构建一个spring批处理应用程序,其中执行了几个步骤。除了一个,所有的步骤都是简单的tasklet(没有读取器或写入器),它们负责各种任务,如复制文件、发送请求、启动批处理(*.bat)文件等。 大多数步骤应该是串行执行的。在一个特定的步骤中,我希望启动X文件,这些文件最多可以有Y个实例。 null 如果:)我想我必须使用taskExecutor,下面我有一个示例,在这里我开始第一步(
假设数组如下所示: 数组中最多可以有100.000个值。 另一方面,如果我这样做: 我得到serialization异常,因为spark正在尝试序列化spark上下文,而spark上下文是不可序列化的。 如何使这个工作,但仍然利用并行性。 这是我得到的咒语:
我正在用s设计异步调用。这是一个批处理调用,在这里我需要同时处理几个实体。在呼叫结束时,我必须收集关于每一个项目的处理状态的信息。 作为输入,我有这些实体的ID数组。这是一个复杂的实体,为了将一个实体编译成一个对象,我必须发出几个DAO调用。每个DAO方法都返回。 我将那些DAO调用链接起来,因为如果其中一个部分不存在,我将无法构造一个完整的对象。下面是我的代码段的样子: 问题是,由于链接的关系,
很多批处理问题都可以通过单进程、单线程的工作模式来完成, 所以在想要做一个复杂设计和实现之前,请审查你是否真的需要那些超级复杂的实现。 衡量实际作业(job)的性能,看看最简单的实现是否能满足需求: 即便是最普通的硬件,也可以在一分钟内读写上百MB数据文件。 当你准备使用并行处理技术来实现批处理作业时,Spring Batch提供一系列选择,本章将对他们进行讲述,虽然某些功能不在本章中涵盖。从高层