Câu hỏi Thay thế tốt hơn cho pmap trong Clojure để song song các hàm không tốn kém vừa phải trên dữ liệu lớn?


Sử dụng clojure Tôi có một lượng dữ liệu rất lớn trong một chuỗi và tôi muốn xử lý nó song song, với một số lượng lõi tương đối nhỏ (4 đến 8).

Điều dễ nhất cần làm là sử dụng pmap thay vì map, để ánh xạ chức năng xử lý của tôi qua chuỗi dữ liệu. Nhưng chi phí điều phối dẫn đến thua lỗ ròng trong trường hợp của tôi.

Tôi nghĩ lý do là pmap giả định hàm được ánh xạ trên dữ liệu rất tốn kém. Nhìn vào mã nguồn của pmap nó xuất hiện để xây dựng một future đối với mỗi phần tử của chuỗi lần lượt để mỗi lần gọi hàm xuất hiện trên một chuỗi riêng biệt (đi qua số lõi có sẵn).

Đây là phần nguồn pmap có liên quan:

(defn pmap
  "Like map, except f is applied in parallel. Semi-lazy in that the
  parallel computation stays ahead of the consumption, but doesn't
  realize the entire result unless required. Only useful for
  computationally intensive functions where the time of f dominates
  the coordination overhead."
  ([f coll]
   (let [n (+ 2 (.. Runtime getRuntime availableProcessors))
         rets (map #(future (f %)) coll)
         step (fn step [[x & xs :as vs] fs]
                (lazy-seq
                 (if-let [s (seq fs)]
                   (cons (deref x) (step xs (rest s)))
                   (map deref vs))))]
     (step rets (drop n rets))))
  ;; multi-collection form of pmap elided

Trong trường hợp của tôi, hàm được ánh xạ không phải là tốn kém nhưng trình tự là rất lớn (hàng triệu bản ghi). Tôi nghĩ rằng chi phí của việc tạo ra và dereferencing rằng nhiều tương lai là nơi đạt được song song bị mất trong chi phí.

Hiểu biết của tôi về pmap chính xác?

Có một mô hình tốt hơn trong clojure cho loại chi phí thấp hơn nhưng xử lý lặp lại ồ ạt hơn pmap? Tôi đang xem xét chunking chuỗi dữ liệu bằng cách nào đó và sau đó chạy các chủ đề trên khối lớn hơn. Đây có phải là một cách tiếp cận hợp lý và những thành ngữ clojure sẽ làm việc?


28
2018-01-20 17:47


gốc


đừng quên tận dụng lợi thế của việc ghi nhớ nếu có. richhickey.github.com/clojure/… - Brian Gianforcaro


Các câu trả lời:


Câu hỏi này: làm thế nào để hiệu quả-áp dụng-một-vừa-trọng-chức năng-in-song song cũng giải quyết vấn đề này trong một bối cảnh rất giống nhau.

Câu trả lời tốt nhất hiện nay là sử dụng partition để chia thành nhiều phần. sau đó pmap một chức năng bản đồ lên từng đoạn. sau đó kết hợp lại kết quả. map-reduce-style.


19
2018-01-20 20:09



ý tưởng là để tăng kích thước chunk để nó đánh bại các chi phí phối hợp trong khi vẫn làm đầy tất cả các lõi. Không phải tất cả các tập dữ liệu đều có điểm ngọt như thế này. - Arthur Ulfeldt
Ah-ha. Tôi cần suy nghĩ ở mức độ trừu tượng bổ sung. tôi pmap một hàm trên các khối và hàm đó sẽ map chức năng xử lý của tôi trên mỗi thành viên của đoạn. Đó có phải là ý bạn không? - Alex Stoddard
Người ta phải cẩn thận không để (âm thầm!) Bỏ qua một số đầu vào với partition do thực tế là nó không bao giờ sản xuất khối nhỏ hơn sau đó quy định. Ví dụ. (partition 5 [1 2]) đánh giá để en trống rỗng seq! clojure.contrib.seq-utils/partition-all (sớm trở thành clojure.contrib.seq/partition-all) đặt một đoạn ngắn cuối cùng thay vào đó (((1 2)) với các đối số như trên). - Michał Marczyk
(phân vùng 5 5 '() [1 2]) sẽ để lại đoạn nhỏ ở cuối và không thả bất cứ thứ gì. - Arthur Ulfeldt
Là thư viện giảm tốc Clojure một giải pháp tốt hơn bây giờ? - Daniel Compton


Đáng buồn là một câu trả lời hợp lệ, nhưng một cái gì đó để xem trong tương lai là công việc của Rich với thư viện fork / join trong Java 7. Nếu bạn nhìn vào nhánh Par của mình trên github, anh ta đã thực hiện một số công việc với nó, và cuối cùng tôi đã thấy những lợi nhuận ban đầu thật tuyệt vời.

Ví dụ về Rich dùng thử.

http://paste.lisp.org/display/84027


5
2018-01-21 04:13



Trên thực tế tôi đã phát hiện ra điều này có thể được thử ngay bây giờ với Java6, nhánh Clojure "par" từ github và tệp jsr166y.jar mà Rich Hickey có sẵn tại: cloud.github.com/downloads/richhickey/clojure/jsr166y.jar - Alex Stoddard
Ồ vậy sao? Có thể phải cho rằng một cái nhìn, như Par trông tuyệt vời. Cảm ơn cho tip, như tôi đã bỏ lỡ điều này. - Runevault
dán đã chết - om-nom-nom
Đây có phải là những gì cuối cùng đã trở thành thư viện reducers? - Daniel Compton


Các ngã ba / tham gia công việc được đề cập trong các câu trả lời trước đó về chủ đề này và tương tự cuối cùng mang trái cây như bộ giảm tốc thư viện, có lẽ đáng xem.


2
2017-09-24 11:36





Bạn có thể sử dụng một số loại bản đồ / giảm được thực hiện bằng tay. Ngoài ra hãy xem swarmiji khuôn khổ.

"Một hệ thống tính toán phân tán giúp viết và chạy mã Clojure song song - trên các lõi và bộ vi xử lý"


0
2018-01-20 19:26



swarmiji nếu một thư viện cho máy tính phân tán ở Clojure. Tôi đã có ấn tượng rằng quiestion này tập trung nhiều hơn vào hệ thống đơn lẻ song song-exacution. - Arthur Ulfeldt