2010-04-12 3 views
13

요소를 병렬로 필터링하는 실험을하고 있습니다. 각 요소에 대해 거리 계산을 수행하여 대상 점에 충분히 근접한 지 확인해야합니다. 이 작업을 수행하기 위해 데이터 구조가 이미 존재한다는 사실을 염두에 두지 마십시오. 지금은 초기 실험을하고 있습니다.계산을 수행 한 후 Clojure가 중단되는 이유는 무엇입니까?

어쨌든 임의의 벡터를 생성하고 필터링하는 아주 기본적인 실험을하고 싶었습니다. 다음 코드는 실행하고 나는 무엇을 기대 반환이

(defn pfilter [pred coll] 
    (map second 
    (filter first 
     (pmap (fn [item] [(pred item) item]) coll)))) 

(defn random-n-vector [n] 
    (take n (repeatedly rand))) 

(defn distance [u v] 
    (Math/sqrt (reduce + (map #(Math/pow (- %1 %2) 2) u v)))) 

(defn -main [& args] 
    (let [[n-str vectors-str threshold-str] args 
     n (Integer/parseInt n-str) 
     vectors (Integer/parseInt vectors-str) 
     threshold (Double/parseDouble threshold-str) 
     random-vector (partial random-n-vector n) 
     u (random-vector)] 
    (time (println n vectors 
     (count 
     (pfilter 
      (fn [v] (< (distance u v) threshold)) 
      (take vectors (repeatedly random-vector)))))))) 

을 모두 수행 내 구현이야, 그 가까이있는 매개 변수 N (벡터의 길이), 벡터 (벡터의 수)와 벡터의 수입니다 대상 벡터에 대한 임계 값보다 내가 이해할 수없는 것은 프로그램이 종료되기 전에 잠시 멈추는 이유이다. 여기

오류를 일반도 환영합니다 이상입니다 내가 아직 pfilter이 실제로 작동하는지 확인하지 않은로서, 병렬로 필터링하는 방법에 대한

 
$ time lein run 10 100000 1.0 
    [null] 10 100000 12283 
    [null] "Elapsed time: 3300.856 msecs" 

real 1m6.336s 
user 0m7.204s 
sys 0m1.495s 

모든 의견을 보여줍니다 실행의 출력입니다.

답변

20

pmap에서 사용하는 스레드 풀을 지원하는 스레드를 중지하려면 shutdown-agents으로 전화해야합니다.

pfilter인데, 당신의 술어가 간단하므로 filter보다 느리게 동작해야합니다. 병렬 처리는 무료가 아니므로 각 스레드에게 적당히 집중적 인 작업을 제공하여 다중 스레드 오버 헤드를 상쇄해야합니다. 항목을 필터링하기 전에 일괄 처리하십시오.

+0

아, 감사합니다. 나는 단순한 거리 질의를 위해 이것을 사용하지 않을 것이지만, 더 쉬운 예가 될 것이다. 감사. – Thomas

관련 문제