2012-04-07 18 views
11

Giả sử tôi có danh sách chuỗi khá lớn (vài triệu mục hoặc hơn). Ý tưởng hay là chạy một cái gì đó như thế này:Bạn có nên chạy `... par.map (` trên danh sách lớn trực tiếp không?

val updatedList = myList.par.map(someAction).toList 

Hoặc nó sẽ là một ý tưởng tốt hơn vào nhóm danh sách trước khi chạy ...par.map(, như thế này:

val numberOfCores = Runtime.getRuntime.availableProcessors 
val updatedList = 
    myList.grouped(numberOfCores).toList.par.map(_.map(someAction)).toList.flatten 

UPDATE: cho rằng someAction là khá đắt (so với grouped , toList, v.v.)

Trả lời

14

Chạy trực tiếp par.map vì đã tính số lượng lõi. Tuy nhiên, đừng giữ một số List, vì điều đó đòi hỏi một bản sao đầy đủ để thực hiện thành một bộ sưu tập song song. Thay vào đó, hãy sử dụng Vector.

8

Như đã đề xuất, tránh sử dụng danh sách và par, vì điều đó đòi hỏi phải sao chép danh sách vào bộ sưu tập có thể dễ dàng truyền tải song song. Xem Parallel Collections Overview để được giải thích.

Như đã trình bày trong section on concrete parallel collection classes, một ParVector có thể ít hiệu quả cho hoạt động hơn một ParArraymap, vì vậy nếu bạn đang thực sự lo ngại về hiệu suất, nó có thể làm cho tinh thần để sử dụng một mảng song song.

Nhưng, nếu someAction là đủ đắt tiền, sau đó tính toán chi phí của nó sẽ ẩn tắc nghẽn tuần tự trong toListpar.

Các vấn đề liên quan