2013-07-16 3 views
1
나는 채점 절차를 Pool.map을 사용하고

: 데이터 소스에서 배열의 수백만파이썬 multiprocessing.Pool & 메모리

  1. "커서"
  2. 계산
  3. 데이터 싱크에 결과를 저장

결과는 독립적입니다.

저는 메모리 요구를 피할 수 있는지 궁금합니다. 처음에는 에서 모든 배열은 파이썬으로 들어가고 2와 3은 으로 진행됩니다. 어쨌든 속도 향상이 있습니다.

#data src and sink is in mongodb# 
def scoring(some_arguments): 
     ### some stuff and finally persist ### 
    collection.update({uid:_uid},{'$set':res_profile},upsert=True) 


cursor = tracking.find(timeout=False) 
score_proc_pool = Pool(options.cores)  
#finaly I use a wrapper so I have only the document as input for map 
score_proc_pool.map(scoring_wrapper,cursor,chunksize=10000) 

내가 잘못했거나 더 좋은 방법이이 목적을 위해 파이썬이 있습니까?

+0

코드 조각을 우리를 함께하기 위해 ? – usethedeathstar

답변

1

map 기능은 __len__ 속성이없는 경우 내부적으로 반복 가능 목록을 목록으로 변환합니다. 관련 코드는 Pool.map (및 starmap)에 의해 사용되어 결과를 산출하기 때문에 Pool.map_async에 있으며 이는 또한 목록입니다. 먼저 메모리에 모든 데이터를 읽을 수 없다 경우

, 당신은 그들이에서 와서 결과를 얻을 것입니다 반복자를 생성 할 것이다, Pool.imap 또는 Pool.imap_unordered을 사용해야합니다.

+0

완벽한, 감사합니다! – Christian

+1

나는 왜 imap과 imap_ordered가 나에게 oom kill *과 map을주지 않는지 궁금해 할까? 파이썬에서 이것을 막을 수있는 방법이 있습니까? 나는 chunksize로 성공했지만 성공하지 못했습니다. – Christian

+0

어, 그건 심각한 것 같습니다. 당신이 보장해야하는 것은 결과를 읽는 과정이 결과물을 생성하는 프로세스보다 훨씬 빠르다는 것입니다. 그렇지 않으면 청크가 쌓일 것입니다. 그리고이 덩어리가 너무 과장된 것처럼 보입니다. 이것은 첫 번째 작업자가 10000 개의 결과를, 그 다음 secont 100000을 기다리는 것을 의미합니다. 나는 chunk가 어떻게 처리되는지를 보여주는 간단한 예제를 작성했다. [http://pastebin.com/YStmwQB3]. 나는 10 ~ 100 배의 CPU 카운트를 사용한다. – mata