在LINQ的withDegreeOfParallelism
中scala並行集合中是否有任何等價物,它設置將運行查詢的線程數?我想要並行運行一個需要有一定數量的線程運行的操作。scala並行集合並行度
36
A
回答
55
與最新的軀幹,使用JVM 1.6或更高版本,可使用:
collection.parallel.ForkJoinTasks.defaultForkJoinPool.setParallelism(parlevel: Int)
這可能是在將來變化的受試者,雖然。計劃在下一個版本中採用更統一的方法來配置所有Scala任務並行API。
但是,請注意,雖然這將確定查詢使用的處理器數量,但這可能不是運行查詢所涉及的實際線程數。由於並行集合支持嵌套並行性,如果檢測到這種情況,實際的線程池實現可能會分配更多線程來運行查詢。
編輯:
從Scala的2.10開始,要設置的平行水平的優選方法是通過tasksupport
字段設置爲一個新的TaskSupport
對象,如下面的例子:
scala> import scala.collection.parallel._
import scala.collection.parallel._
scala> val pc = mutable.ParArray(1, 2, 3)
pc: scala.collection.parallel.mutable.ParArray[Int] = ParArray(1, 2, 3)
scala> pc.tasksupport = new ForkJoinTaskSupport(new scala.concurrent.forkjoin.ForkJoinPool(2))
pc.tasksupport: scala.collection.parallel.TaskSupport = [email protected]
scala> pc map { _ + 1 }
res0: scala.collection.parallel.mutable.ParArray[Int] = ParArray(2, 3, 4)
在實例使用fork連接池的ForkJoinTaskSupport
對象必須將fork連接池的並行級別設置爲所需的值(示例中爲2
)。
5
獨立的JVM版本,使用Scala 2.9+(平行引入集合),你也可以使用的grouped(Int)
和par
功能的組合對小塊執行並行作業,如:
scala> val c = 1 to 5
c: scala.collection.immutable.Range.Inclusive = Range(1, 2, 3, 4, 5)
scala> c.grouped(2).seq.flatMap(_.par.map(_ * 2)).toList
res11: List[Int] = List(2, 4, 6, 8, 10)
grouped(2)
創建長度爲2或更小的塊,seq
確保塊的集合不平行(在本例中無用),然後在小平行塊上執行_ * 2
函數(使用par
創建),從而確保至多2個線程並行執行。
然而,這可能會比設置工作池參數效率稍低,我不確定這一點。
相關問題
- 1. Scala 2.9和Actor中的並行集合
- 2. Scala並行集合上的哪些操作是並行化的?
- 3. Scala:如何合併地圖集合
- 4. Scala並行集合:如何知道和配置線程數
- 5. 如何避免使用scala並行集合的競爭條件
- 6. 如何替換Scala 2.9並行集合的分支連接池?
- 7. Spark/Scala並行寫入redis
- 8. 行合併2008
- 9. 行合併
- 10. 合併行
- 11. 合併錶行
- 12. VBA合併行
- 13. google.visualisation.DataTable()合併行
- 14. google.visualisation.DataTable()行合併
- 15. 並行合併排序
- 16. SSRS行合併到結果集
- 17. 多個集合的並行迭代
- 18. 在XML文檔中合併行集
- 19. 並行Linq到對象集合
- 20. 並行迭代幾個集合
- 21. 在scala中運行並行程序
- 22. 將列B的行與已合併行的行數合併A
- 23. 合併兩行合併到一列
- 24. 智能SQL合併 - n行,合併
- 25. 合併sql行組
- 26. 合併的兩行
- 27. 合併行到1
- 28. 合併兩行SQL
- 29. 合併圖案行/
- 30. Subversion合併行爲
我很懷疑這會給你帶來什麼。我需要看到證明它的基準數字。 – 2013-04-05 19:31:52