Multithreading 通过Scala并行集合更新阵列

Multithreading 通过Scala并行集合更新阵列,multithreading,scala,synchronization,scala-collections,parallel-collections,Multithreading,Scala,Synchronization,Scala Collections,Parallel Collections,我有如下定义的HashMap数组 var distinctElementsDefinitionMap: scala.collection.mutable.ArrayBuffer[HashMap[String, Int]] = new scala.collection.mutable.ArrayBuffer[HashMap[String, Int]](300) with scala.collection.mutable.SynchronizedBuffer[HashMap[String, Int]

我有如下定义的HashMap数组

var distinctElementsDefinitionMap: scala.collection.mutable.ArrayBuffer[HashMap[String, Int]] = new scala.collection.mutable.ArrayBuffer[HashMap[String, Int]](300) with scala.collection.mutable.SynchronizedBuffer[HashMap[String, Int]]
现在,我有一个300个元素的并行集合

val max_length = 300
val columnArray = (0 until max_length).toParArray
import scala.collection.parallel.ForkJoinTaskSupport
columnArray.tasksupport = new ForkJoinTaskSupport(new scala.concurrent.forkjoin.ForkJoinPool(100))
columnArray foreach(i => {
    // Do Some Computation and get a HashMap
    var distinctElementsMap: HashMap[String, Int] = //Some Value
    //This line might result in Concurrent Access Exception
    distinctElementsDefinitionMap.update(i, distinctElementsMap)
})
我现在在上面定义的columnArray上的foreach循环中运行计算密集型任务。 计算完成后,我希望每个线程更新distinctElementsDefinitionMap数组的特定条目。 每个线程只更新特定的索引值,该索引值对于执行它的线程是唯一的。 我想知道,当多个线程可能同时写入数组时,数组项的更新是否安全? 如果没有,是否有一种同步方式来实现线程安全? 谢谢大家!

更新: 看来这真的不是安全的方法。我得到一个java.util.ConcurrentModificationException 关于如何在使用并行集合时避免这种情况的任何提示。

根据我的判断,请使用.groupBy操作,这与其他一些方法不同,例如.sorted

希望你有这个想法

或者,如果您的RAM允许您并行处理每一列,而不是每一行,那么它必须比您当前的方法更高效,从而减少争用

val columnsCount = 3 // 300 in your case
Vector.range(0, columnsCount).par.map { column => 
  data.groupBy(row => row(column))
}.seq 

尽管您可能会有内存问题,即使是单列8M行,也可能会有很多。

您滥用并行集合-它不是一个时髦的普通旧线程池,而是将处理转移到smarty池工作!避免使用副作用,然后以单线程方式使用可能的处理结果。再一次,这是一个并行集合,而不是并发集合。也许你可以给我们一个更大的图景,你想存档什么?我完全同意,我知道我所做的不是最好的方式,甚至不是一个好的方式。但我只是Scala的初学者,仍然在寻找自己的出路。但我需要一个并行循环,这是我想到的唯一方法。为这种简陋的方法道歉!不用担心,但不太清楚为什么在完成每个任务后需要更新映射中的条目。如果你澄清一下,也许我们可以想出另一个惯用的解决方案。嗯,基本上我有一个300列,8密耳行的数据集。我需要为每个列创建一个hashmap,为这个hashmap的每个不同值找到一个从字符串值到整数值的映射。因此需要一个哈希映射数组。数组的每个条目都是一个哈希映射,对应于该列的不同值。一种方法是按顺序查找每列的hashmap并更新distinctElementsDefinitionMap数组。但我想加快它的速度,从而使用并行集合。编辑我的问题以显示正在进行的更新
val columnsCount = 3 // 300 in your case
Vector.range(0, columnsCount).par.map { column => 
  data.groupBy(row => row(column))
}.seq