首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >R parLapply不平行

R parLapply不平行
EN

Stack Overflow用户
提问于 2017-04-06 19:29:50
回答 1查看 1.8K关注 0票数 4

我目前正在开发一个R包,它将使用并行计算来解决一些任务,通过“并行”程序包。

当我使用包的内部函数定义的集群时,我遇到了一些非常尴尬的行为,其中parLapply函数将一个作业分配给一个工人,然后等待它完成为下一个工作分配一个任务。或者至少通过观察日志文件"cluster.log“和unix中正在运行的进程列表,这似乎是正在发生的事情。

下面是在我的包中声明的原始函数的模拟版本:

代码语言:javascript
运行
AI代码解释
复制
.parSolver <- function( varMatrix, var1 ) {

    no_cores <- detectCores()

    #Rows in varMatrix
    rows <- 1:nrow(varMatrix[,])

    # Split rows in n parts
    n <- no_cores
    parts <- split(rows, cut(rows, n))

    # Initiate cluster
    cl <- makePSOCKcluster(no_cores, methods = FALSE, outfile = "/home/cluster.log")
    clusterEvalQ(cl, library(raster))
    clusterExport(cl, "varMatrix", envir=environment())
    clusterExport(cl, "var1", envir=environment())


    rParts <- parLapply(cl = cl, X = 1:n, fun = function(x){
        part <- rasterize(varMatrix[parts[[x]],], raster(var1), .....)
        print(x)
        return(part)
        })

    do.call(merge, rParts)
}

备注:

  • 我使用makePSOCKcluster是因为我希望代码运行在windows和unix系统上,尽管这个特殊的问题只是在unix系统中表现出来。
  • 功能光栅化和光栅定义在库(光栅),导出到集群。

奇怪的是,如果我在全局环境中执行函数parSolver的完全相同的代码,那么每件事情都能顺利地工作,所有的工作人员都同时完成一项任务,并且任务很快就完成了。然而,如果我做这样的事情:

代码语言:javascript
运行
AI代码解释
复制
library(myPackage)

varMatrix <- (...)
var1 <- (...)
result <- parSolver(varMatrix, var1)

出现了描述的问题。

然而,这似乎是一个负载平衡问题,但这并不能解释为什么它在一种情况下工作正常,而在另一种情况下不工作。

我是不是漏掉了什么?提前谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-08-01 13:16:53

我不认为parLapply按顺序运行。更有可能的是,它只是运行效率低下,使它看起来像按顺序运行。

我有几个改进的建议:

  • 不要在parSolver中定义worker函数
  • 不要将所有的varMatrix导出给每个工人
  • parSolver之外创建集群

第一点很重要,因为正如您现在的例子所示,parSolver中定义的所有变量都将与匿名工作者函数一起序列化,并通过parLapply发送给工作人员。通过在任何函数之外定义worker函数,序列化将不会捕获任何不必要的变量。

第二点避免不必要的套接字I/O,使用更少的内存,使代码更具可伸缩性。

这里有一个假的,但内容完整的例子,类似于你的例子,证明了我的建议:

代码语言:javascript
运行
AI代码解释
复制
# Define worker function outside of any function to avoid
# serialization problems (such as unexpected variable capture)
workerfn <- function(mat, var1) {
    library(raster)
    mat * var1
}

parSolver <- function(cl, varMatrix, var1) {
    parts <- splitIndices(nrow(varMatrix), length(cl))
    varMatrixParts <- lapply(parts, function(i) varMatrix[i,,drop=FALSE])
    rParts <- clusterApply(cl, varMatrixParts, workerfn, var1)
    do.call(rbind, rParts)
}

library(parallel)
cl <- makePSOCKcluster(3)
r <- parSolver(cl, matrix(1:20, 10, 2), 2)
print(r)

注意,这利用了clusterApply函数来迭代varMatrix的行块列表,这样就不需要将整个矩阵发送给每个人。它还避免了对clusterEvalQclusterExport的调用,简化了代码,并使其更加高效。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43269142

复制
相关文章
在 JavaScript 中如何克隆对象?
我们假设一个变量 name 具有一个与之关联的原始值(number,string,boolean,undefined 和null)。 如果我们将此变量 name 复制到另一个变量name2 ,则原始变量的任何修改都不会影响到第二个变量,因为它们是原始值。
前端小智@大迁世界
2022/06/15
4.9K0
触发器在渗透中的利用
0x01 什么是触发器: 触发器对表进行插入、更新、删除的时候会自动执行的特殊存储过程。触发器一般用在check约束更加复杂的约束上面。触发器和普通的存储过程的区别是:触发器是当对某一个表进行操作。诸如:update、insert、delete这些操作的时候,系统会自动调用执行该表上对应的触发器。SQL Server 2005中触发器可以分为两类:DML触发器和DDL触发器,其中DDL触发器它们会影响多种数据定义语言语句而激发,这些语句有create、alter、drop语句。 0x02 问题描述: a)通
逸鹏
2018/04/09
1.5K0
触发器在渗透中的利用
详解JavaScript之神奇的Object.defineProperty
摘要: JavaScript有个很神奇的Object.defineProperty(),了解一下?
Fundebug
2018/07/05
6060
在 Kubernetes 中,如何动态配置本地存储?
Kubernetes 中使用节点的本地存储资源有 emptyDir、hostPath、Local PV 等几种方式。这之中,emptyDir 无法持久化数据,hostPath 方式需要手动管理卷的生命周期,运维压力大。因此在某些场景下,如果用户出于性能和运维成本考虑需要使用本地存储,Local PV 似乎是唯一选择。
CNCF
2019/12/05
3.5K0
在 Kubernetes 中,如何动态配置本地存储?
95 - 在Flask中如何使用动态路由
1. 静态路由和动态路由有什么区别? 路由 Utl Path http://loaclhost/abc/test.html 静态路由 Path与路由函数一一对应 动态路由 多个Path与同一个路由函数对应 http://loaclhost/abc/test.html http://loaclhost/xyz/test.html 不管访问哪一个Url,都会执行同一个服务端的路由函数 2. 如何使用Flask实现动态路由 ''' pip install flack ''' from flask import
ruochen
2021/06/27
5.6K0
95 - 在Flask中如何使用动态路由
在 Kubernetes 中,如何动态配置本地存储?
Kubernetes 中使用节点的本地存储资源有 emptyDir、hostPath、Local PV 等几种方式。这之中,emptyDir 无法持久化数据,hostPath 方式需要手动管理卷的生命周期,运维压力大。因此在某些场景下,如果用户出于性能和运维成本考虑需要使用本地存储,Local PV 似乎是唯一选择。
kubernetes中文社区
2019/08/27
3.2K0
在 Kubernetes 中,如何动态配置本地存储?
【译】如何避免在JavaScript中阻塞DOM
原文链接:https://www.sitepoint.com/avoiding-dom-blocking/
腾讯IVWEB团队
2020/06/28
2.9K0
JavaScript中动态生成表格
行:<input type="text" id="row" value="5"><br>
马克社区
2022/04/19
2.1K0
在直播app制作过程中,服务器是如何配置的?
不论是一对多直播还是一对一直播app制作,关于服务器的配置和成本是大多数运营商比较关心和头疼的问题。一般来说,在直播app运营的每个阶段,所安排的服务器台数和负责的功能都是不一样的。那么如何在有限的成本中搭配出高效的服务器模组?针对这个问题,小编今天就给各位初入直播行业的运营商说明一下。
就爱吃小笼包
2019/09/26
2K0
在直播app制作过程中,服务器是如何配置的?
利用PPT如何设计制作创意相框
很多人都希望自己的PPT能够独具匠心,在展示图片或制作电子相册时,总想让图片有个新颖、独特的相框,而PPT自带的图片边框显得“力不从心”。如果利用自选图形,再经过边线及内部填充等设置,就能够制作出具有创意效果的相框。下面iSlide就讲述微立体相框和水晶相框的制作技法。
纸醉金迷i
2022/01/27
4.2K0
利用PPT如何设计制作创意相框
Vue2.X是如何利用Object.defineProperty()实现数据绑定的
Vue2.X是如何利用Object.defineProperty()实现数据绑定的
伯约同学
2022/02/15
4800
经典笔试题-在HTML中如何包含JavaScript?
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
cwl_java
2019/11/20
2K0
如何制作自己的原生 JavaScript 路由
当你想到路由时,通常会想到类似 React 之类的库。但实际上,这些库和框架仍然使用 vanilla JavaScript。那么该怎么实现呢?
疯狂的技术宅
2020/03/27
4K0
利用c语言制作简易计算器
学了c语言之后,总想着能用c语言能制作一些简单的小工具来。而利用c语言来制作一款简易的计算器是一个不错的选择,用这款计算器可以计算的加、减、乘、除。
诸葛青云
2018/09/05
4.7K0
javascript 动态函数如何创建?
JavaScript作为一门动态语言,提供了多种创建动态函数的方法。动态函数的创建允许我们在运行时根据需要生成函数,从而实现灵活的编程和动态逻辑。本文将介绍动态函数的概念,探讨几种常用的方法来创建动态函数,并分享一些动态函数的应用场景。
海拥
2023/06/27
6760
javascript 动态函数如何创建?
如何采集javascript动态加载网页
从一个运行 javascript 的网站加载所有数据来加载内容,目前的问题是当运行启动代码时它无法加载 javascript 内容,因为用户应该向下滚动才能加载。如何编写启动代码来滚动整页呈现 javacript 并返回 html呢?
jackcode
2023/05/24
1K0
如何采集javascript动态加载网页
如何利用 JavaScript 实现并发控制
  例如一个爬虫程序,可以通过限制其并发任务数量来降低请求频率,从而避免由于请求过于频繁被封禁问题的发生。
Nealyang
2021/01/28
1.6K0
如何利用 JavaScript 实现并发控制
在Scrapy中如何利用CSS选择器从网页中采集目标数据——详细教程(上篇)
前几天给大家分享了Xpath语法的简易使用教程,没来得及上车的小伙伴可以戳这篇文章:在Scrapy中如何利用Xpath选择器从网页中采集目标数据——详细教程(上篇)、在Scrapy中如何利用Xpath选择器从网页中采集目标数据——详细教程(下篇)。今天小编给大家介绍Scrapy中另外一种选择器,即大家经常听说的CSS选择器。
Python进阶者
2020/11/03
3K0
在Scrapy中如何利用CSS选择器从网页中采集目标数据——详细教程(上篇)
在Scrapy中如何利用CSS选择器从网页中采集目标数据——详细教程(下篇)
前几天给大家分享了Xpath语法的简易使用教程,没来得及上车的小伙伴可以戳这篇文章:在Scrapy中如何利用Xpath选择器从网页中采集目标数据——详细教程(上篇)、在Scrapy中如何利用Xpath选择器从网页中采集目标数据——详细教程(下篇)、在Scrapy中如何利用CSS选择器从网页中采集目标数据——详细教程(上篇)。之前还给大家分享了在Scrapy中如何利用CSS选择器从网页中采集目标数据——详细教程(上篇),没来得及上车的小伙伴可以戳进去看看,今天继续上篇的内容往下进行。
Python进阶者
2020/11/03
2.8K0
在Scrapy中如何利用CSS选择器从网页中采集目标数据——详细教程(下篇)
在C中,如何知道动态分配是否成功
C语言使用 malloc函数动态在堆上分配内存。malloc根据字节数的参数。如果无法分配内存,该函数将返回指向已分配内存的指针或 NULL 指针。
mariolu
2021/11/06
2.8K0

相似问题

在列表中按索引查找min/max

22

按索引jQuery查找子项

30

Python:在多维列表中按范围查找索引

329

如何在jquery中按索引查找td

310

按索引在泛型列表中查找对象

33
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档