2017-03-05 5 views
0

multiprocessing으로 JSON 파일을 수정하려고합니다. JSON을 여러 조각으로 나눠서 각 프로세스가 JSON의 특정 부분에만 액세스하고 수정하도록 할 수 있습니다 (따라서 두 속성이 동일한 속성을 수정하지 못하도록 보장합니다). 내 질문은 변경 사항이 원래 개체에 반영되도록 프로세스간에 JSON 개체를 공유하려면 어떻게해야합니까? 나는 multiprocessing이 사본으로 객체를 전달하므로 Manager()을 사용할 필요가 있지만 정확히 어떻게 할 수 있습니까? 현재 내가Python 다중 처리 - 여러 프로세스를 통해 JSON 수정

def parallelUpdateJSON(datachunk): 
    for feature in datachunk: 
     #modify chunk 

def writeGeoJSON(): 
    with open('geo.geojson') as f: 
     data = json.load(f) 
    pool = Pool() 
    for i in range(0, mp.cpu_count())): 
     #chunk data into a list, so I get listofchunks = [chunk1, chunk2, etc.,] 
     #where chunk1 = data[0:chunksize], chunk2 = data[chunksize:2*chunksize] etc. 
    pool.map(parallelUpdateJSON, listofchunks) 
    pool.close() 
    pool.join() 
    with open('test_parallel.geojson', 'w') as outfile: 
     json.dump(data, outfile) 

을 가지고 있지만 원래 data 객체가 수정되지 않도록 물론 이것은 사본으로 청크를 전달합니다. data가 프로세스에 의해 실제로 수정되도록하려면 어떻게해야합니까? 고맙습니다!

+0

당신은 나 또한 parallelUpdateJSON''에 datachunk' 반환 '해야 할 것, 프로세스가 결과를 – BlackBear

답변

-1

출력 파일에 대한 동기식 액세스를 피하는 것이 좋습니다. N 부분 출력을 생성하고 json 객체의 속성에 함께 결합하는 것이 훨씬 쉽습니다. 그런 다음 해당 객체를 파일로 덤프 할 수 있습니다.

def process(work): 
    return str(work[::-1]) 

if __name__ == "__main__": 
    p = Pool() 
    structure = json.loads(""" 
    { "list": 
     [ 
      "the quick brown fox jumped over the lazy dog", 
      "the quick brown dog jumped over the lazy fox" 
     ] 
    } 
    """) 
    structure["results"] = p.map(process, structure["list"]) 
    #print(json.dumps(structure)) 
    with open("result.json", "w") as f: 
     json.dump(structure, f) 
+0

감사를 넣어하는 당신이 JSON 개체를 수정할 넣어하는 큐, 또 다른 큐를 사용할 필요가 권리? –

+0

또한,'TypeError : 'ApplyResult'객체가이 객체에 대해 반복 가능하지 않습니다. –

+0

아마도 [documentation] (https://docs.python.org/2/library/multiprocessing.html#multiprocessing.pool.multiprocessing.Pool.apply)에서 "func는 풀 "이므로 모든 청크에 기능을 매핑하지 않고 단지 하나의 프로세스 만 실행합니다. –