kullanarak büyük sayıdaki sayıların toplamını nasıl hesaplayabilirim? Basit bir işlemi büyük bir sıraya paralel olarak verimli bir şekilde uygulamak için clojure'un nasıl kullanılacağını anlamaya çalışıyorum. Makinemdeki birden fazla çekirdekten yararlanmak için paralel çözümü kullanabilmek için hızlandırmak istiyorum.Clojure
Giriş bölümündeki her öğe için bir geleceği oluşturmanın ek yükünü azaltmak için pmap'i bölümleme ile birlikte kullanmaya çalışıyorum. Ne yazık ki, bölüm-tüm her bölümün tam değerlendirmesini zorlar. Bu, makinemde bir OutOfMemoryError neden olur.
(defn sum [vs]
(reduce + vs))
(def workers
(+ 2 (.. Runtime getRuntime availableProcessors)))
(let
[n 80000000
vs (range n)]
(time (sum vs))
(time (sum (pmap sum (partition-all (long (/ n workers)) vs)))))
Büyük bir girdi kümesine toplamı nasıl uygulayabilirim ve seri uygulamanın performansını nasıl kullanabilirim?
Çözüm düşürücüler kütüphanesini işaret için @Arthur Ulfeldt için
teşekkür ederiz. İşte redüktörleri kullanarak çözüm. Bu kod, çok çekirdekli bir makinede çalışırken beklenen performans artışını gösterir. bir parça deneyin ben oldukça büyük parçalar geçiş aşmak için gerekli olduğunu bulduk pmap ve gelecek havai kullanırken
(require '[clojure.core.reducers :as r])
(let
[n 80000000
vs #(range n)]
(time (reduce + (vs)))
(time (r/fold + (vs)))
parçalar yanlış yol Are etrafında? '(bölüm-tüm işçiler vs)' '(/ n işçi)' uzunluklarını 'işçi' dizileri oluşturur. Sen istemiyor musun (tüm bölüm (uzun (/ işçi)) vs) '? –
@ A.Webb, düzeltmeniz için teşekkür ederiz. Soruyu değiştireceğim. Bu düzeltme, paralel sürümü biraz daha hızlı hale getirmeye yardımcı olur, ancak yine de seri uygulamayı yenemez ve hala çok büyük girişlerde bellek yetersiz kalır. –