2016-11-06 3 views
0

나는 monger를 사용하고 find-maps를 사용하여 mongo nosql 데이터베이스에서 일괄 처리를 가져옵니다. 그것은 내 함수 호출 체인에서 datastore 인수 (참조) 다운 스트림으로 사용할 계획 인 배열을 반환합니다. 향후 함수 호출 내에서 해당 ID에 액세스 할 수 있습니다. 이 ID를 내 데이터 저장소에서 가져 오기위한 조회로 사용하여 다른 호출자를 호출 할 필요가 없기를 바랍니다. 배열 형식의 데이터 저장소는 ID로 개체에 액세스하는 가장 빠른 방법처럼 보이지 않지만 .... 확실하지 않습니다.이 더 빠릅니까? 조건 fn 또는 get-in으로 맵핑하거나 축소합니까?

나는이 데이터 저장소 배열에서 개체를 도출하기 위해 필요한 경우, 그때 후 경우,

(defn fetchObjFromArray [fetch_id inputarray] 

    (reduce (fn [reduced_obj element_obj] 

       (if (= fetch_id (get-in element_obj [:_id])) 
        element_obj ;; ignoring duplicates for conversation 
        reduced_obj 
       )  
      ) 
      {} 
      inputarray 
    ) 
) 

대신 (모든 요소를 ​​통해 그 N (로그인 할 수 있습니다))이 같은 기능을 사용할 필요가 거라고

(defn createReportFromObjArray [inputarray] 

    (reduce (fn [returnobj elementobj] 

       (let [_id (get-in elementobj [:_id]) 
         keyword (keyword _id)] 

        (assoc returnobj keyword elementobj) 
       ) ;; ignoring duplicates for conversation 
      ) 
      {} 
      inputarray) 
) 

은 아마도 내 후속 호출 대신 얻을-에서 사용할 수와 내가 키를 가져 오는 것 때문이 훨씬 빠른 것 : 내 초기 상인의 호출은,이 같은 기능을 가진 키/발 해시 객체를 생성 ?

나는 때문에 혼란 :

(let [report (createReportFromObjArray inputarray) 
     target_val (get-in report [(keyword fetch_id)])] 
: 그것은 키와 fetch_id 사이의 일치를 찾을 때까지/발 객체를 내가 얻을-에서 사용하는 경우는 키의 각 키를 반복 할 필요가 없습니다있다

get-in이 모든 키에 대해 로그를 남기지 않는 이유는 무엇입니까? Map/Reduction이 log (n)을 통해 전체적으로 진행되어야하는 첫 번째 "일치"를 발견했을 때 멈출 수 있기 때문에 빠를 수도 있습니까? 이 방법은 배열의 각 요소를 반복하고 id가 fetch_id와 일치 하는지를 확인하는 것보다 더 빠릅니까?

제공 할 수있는 도움에 대해 매우 감사드립니다.

답변

3

두 번째 코드 예제에서는 선형 시간으로 Clojure 해시 맵을 작성합니다. get 및 파생어를 통해 조회 성능은 O (log32 (N))입니다.

첫 번째 예에서는 전체 입력을 스캔하여 ID 또는 빈 해시 맵과 일치하는 마지막 요소를 반환합니다. 이는 실수로 발생했을 수 있습니다.

는 _

나는 두 번째 코드 예제 대신 (group-by :_id)를 사용하는 것이 좋습니다. 또한 첫 번째 예제 대신에 (first (filter (comp #{fetch_id} :_id) inputarray))을 사용하는 것이 좋습니다.

keyword을 통해 키워드에 캐스트하지 마십시오. Clojure 키워드는 일반적으로 컴파일시 알려야합니다. 지도는 임의의 데이터 유형을 키로 지원합니다.

+0

그래서 (get-in ...)을 사용하면 관련 값을 찾기 위해 각 키를 넘겨야하는 것보다 (O (log32 (N))을 더 잘 수행하는 알고리즘이 내장되어 있습니까? –

+1

두 번째 및 세 번째 예제에서는 해시 맵을 작성하는 방법과 get-in을 통해 키를 찾는 방법을 보여줍니다 (get을 사용할 수도 있음). 그것은 성능을 말했다. 두 번째 예제에서 해시 맵을 작성했기 때문에 해시 맵에서 키를 찾는 성능은 무언가를 찾을 때까지 모든 요소를 ​​반복하는 첫 번째 예제보다 훨씬 낫습니다. https://en.wikipedia.org/wiki/Hash_table을 이해하고 싶거나 질문에 오해 한 것 같습니다. –