Scala 中并行集合的效率/可扩展性(图)

2024-02-06

因此,我一直在 Scala 中使用并行集合来处理我正在开发的图形项目,我已经定义了图形类的基础知识,它目前正在使用scala.collection.mutable.HashMap关键在哪里Int其值为ListBuffer[Int](邻接表)。 (编辑:此后已更改为ArrayBuffer[Int]

几个月前我用 C++ 做了类似的事情,std::vector<int, std::vector<int> >.

我现在想做的是在图中的所有顶点对之间运行一个度量,所以在 C++ 中我做了这样的事情:

// myVec = std::vector<int> of vertices
for (std::vector<int>::iterator iter = myVec.begin(); iter != myVec.end(); ++iter) {
    for (std::vector<int>::iterator iter2 = myVec.begin(); 
        iter2 != myVec.end(); ++iter2) {
        /* Run algorithm between *iter and *iter2 */
    }
}

我在 Scala 中做了同样的事情,并行化,(或尝试)这样做:

// vertexList is a List[Int] (NOW CHANGED TO Array[Int] - see below)
vertexList.par.foreach(u =>
  vertexList.foreach(v =>
    /* Run algorithm between u and v */
  )
)

C++版本显然是单线程的,Scala版本有.par所以它使用并行集合,并且在 8 核(同一台机器)上是多线程的。然而,C++ 版本在大约 3 天内处理了 305,570 对,而 Scala 版本迄今为止仅在 17 小时内处理了 23,573 对。

假设我做了我的math http://www.wolframalpha.com/input/?i=%28%2850%20%2a%206115%29%20/%20%283%2a24%29%29%20/%20%2823573/17%29正确的是,单线程 C++ 版本大约比 Scala 版本快 3 倍。 Scala 真的比 C++ 慢很多吗?还是我完全误用了 Scala(我最近才开始使用 Scala,我已经读了大约 300 页的《Scala 编程》了)?

谢谢! -kstruct

EDIT要使用 while 循环,我需要做类似的事情吗?

// Where vertexList is an Array[Int]
vertexList.par.foreach(u =>
  while (i <- 0 until vertexList.length) {
    /* Run algorithm between u and vertexList(i) */
  }
}

如果你们的意思是对整个事情使用 while 循环,是否有等效的.par.foreach一会儿?

EDIT2等一下,该代码甚至都不正确 - 我的错。我如何使用 while 循环并行化它?如果我有一些var i跟踪迭代,那么所有线程都不会共享它i?


从您的评论中,我看到您更新了共享可变HashMap在每个算法运行结束时。如果你随机散步,共享Random也是一个争论点。

我建议进行两项更改:

  1. Use .map and .flatMap返回不可变集合而不是修改共享集合。
  2. Use a ThreadLocalRandom(从任一Akka http://doc.akka.io/api/akka/2.0/#akka.jsr166y.ThreadLocalRandom%24 or Java 7 http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ThreadLocalRandom.html) 减少随机数生成器上的争用
  3. 检查算法的其余部分以了解更多可能的争用点。
  4. 您也可以尝试并行运行内部循环。但如果不了解你的算法,就很难知道这是否有帮助或有害。幸运的是,运行并行和顺序收集的所有组合非常简单;只是关掉pVertexList and vertexList在下面的代码中。

像这样的东西:

val pVertexList = vertexList.par
val allResult = for {
  u <- pVertexList
  v <- pVertexList
} yield {
  /* Run algorithm between u and v */
  ((u -> v) -> result)
}

价值allResult将是一个ParVector[((Int, Int), Int)]。您可以致电.toMap将其转换为Map.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Scala 中并行集合的效率/可扩展性(图) 的相关文章

  • scala中的反引号有什么用[重复]

    这个问题在这里已经有答案了 我在一本书上找到了以下代码 val list List 5 4 3 2 1 val result 0 list running total next element running total next elem
  • Slick和bonecp:org.postgresql.util.PSQLException:FATAL:抱歉,太多客户端已经错误

    当我在本地开发应用程序时 我使用以下命令启动我的 play2 应用程序sbt run 我喜欢如何更改代码 然后重新加载浏览器以查看我的更改 在大约 10 次代码更改之后 我收到 postgresql 太多连接错误 见下文 我的数据库连接使用
  • 解决“Show”类型类实例的隐式问题

    我正在努力使Gender实施Show类型类 scala gt trait Gender extends Show Gender defined trait Gender scala gt case object Male extends G
  • 如何在超时的情况下在单独的调度程序上运行 Akka Streams 图?

    这个问题是基于我做过的一个宠物项目 这个SO https stackoverflow com questions 34641861 akka http blocking in a future blocks the server 34645
  • 具有继承类型的 Aux 模式推理失败

    我有一个复杂的玩具算法 我希望纯粹在类型级别上表示 根据饮食要求选择当天菜肴的修改 对卷积表示歉意 但我认为我们需要每一层才能达到我想要使用的最终界面 我的代码有一个问题 如果我们表达一个类型约束Aux 模式生成的类型基于另一个泛型类型 它
  • Scala Spark 包含与不包含

    我可以使用 contains 过滤 RDD 中的元组 如下所示 但是使用 不包含 来过滤 RDD 又如何呢 val rdd2 rdd1 filter x gt x 1 contains 我找不到这个的语法 假设这是可能的并且我没有使用Dat
  • d3力定向布局-链接距离优先

    在 d3 中使用力导向布局 如何使链接距离成为优先事项 同时仍然保持良好的图形布局 如果我指定动态链接距离 但保留默认费用 则我的图形距离会因费用函数而发生一些变形 并且不再是准确的距离 但是 如果我删除电荷 图表将如下所示 任何建议表示赞
  • Java 拥有闭包后 Scala 的优势 [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 随着 Java 中添加了闭包 作为语言选择 Scala 相对于 Java 的优势是什么 有人可以详细说明一下有什么优点吗 除了闭包 J
  • 了解 Spark 中的 DAG

    问题是我有以下 DAG 我认为当需要洗牌时 火花将工作划分为不同的阶段 考虑阶段 0 和阶段 1 有些操作不需要洗牌 那么为什么 Spark 将它们分成不同的阶段呢 我认为跨分区的实际数据移动应该发生在第 2 阶段 因为这里我们需要cogr
  • 如何调用 Scala 抽象类型的构造函数?

    我试图弄清楚如何调用 Scala 抽象类型的构造函数 class Journey val length Int class PlaneJourney length Int extends Journey length class BoatJ
  • Spark:查找前 n 个值的高性能方法

    我有一个很大的数据集 我想找到具有 n 个最高值的行 id count id1 10 id2 15 id3 5 我能想到的唯一方法是使用row number没有分区就像 val window Window orderBy desc coun
  • 在 scala 宏中使用 LabelDef (2.10)

    我正在尝试 scala 2 10 宏功能 我使用时遇到问题LabelDef但在某些情况下 在某种程度上 我偷看了编译器的代码 阅读了摘录米格尔 加西亚的论文 http lampwww epfl ch magarcia但我还是卡住了 如果我的
  • 在没有匹配器的情况下如何跳过specs2中的测试?

    我正在尝试使用 scala 中的 specs2 测试一些与数据库相关的内容 目标是测试 db running 然后执行测试 我发现如果数据库关闭 我可以使用 Matcher 类中的 orSkip 问题是 我正在获取一个匹配条件的输出 作为
  • 过滤器的 Scala 集合类型

    假设您有一个 List 1 1 其类型为 List Any 这当然是正确的且符合预期 现在如果我像这样映射列表 scala gt List 1 1 map case x Int gt x case y String gt y toInt 结
  • HDFS:使用 Java / Scala API 移动多个文件

    我需要使用 Java Scala 程序移动 HDFS 中对应于给定正则表达式的多个文件 例如 我必须移动所有名称为 xml从文件夹a到文件夹b 使用 shell 命令我可以使用以下命令 bin hdfs dfs mv a xml b 我可以
  • 从数据框中绘制多条平滑线

    我对 R 比较陌生 我正在尝试绘制从 csv 文件加载的数据框 数据由 6 列组成 如下所示 xval col1 col2 col3 col4 col5 第一列 xval 由一系列单调递增的正整数 例如 10 40 60 等 组成 其他列
  • InvalidRequestException(为什么:empid 如果包含 Equal,则不能被多个关系限制)

    这是关于我从 Apache Spark 查询 Cassandra 时遇到的问题 Spark 的正常查询工作正常 没有任何问题 但是当我使用关键条件进行查询时 出现以下错误 最初 我尝试查询复合键列族 它也给出了与下面相同的问题 由以下原因引
  • ScalaTest v3:为什么需要实现convertToLegacyEqualizer

    Using 斯卡拉测试3 0 0 http www scalatest org install环境 Scala 2 11 8 sbt 0 13 5 IntelliJ 14 1 4 build sbt 只有 NOTE not using or
  • Spark-1.6.1 上的 DMLC 的 XGBoost-4j

    我正在尝试在 Spark 1 6 1 上使用 DMLC 的 XGBoost 实现 我能够使用 XGBoost 训练我的数据 但在预测方面面临困难 我实际上想以在 Apache Spark mllib 库中完成的方式进行预测 这有助于计算训练
  • Slick:将操作与 DBIOAction 的 Seq 组合起来

    我有 工作 以下代码 val actions for lt slickUsers insertOrUpdate dbUser loginInfo lt loginInfoAction lt slickUserLoginInfos DBUse

随机推荐