2017-03-05 115 views
0

我試圖修改一個JSON文件multiprocessing。我將能夠將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

你需要使用在你把JSON對象修改隊列,另一個隊列中的進程將會把結果 – 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

謝謝,我也不得不在''parallelUpdateJSON'返回datachunk'對? –

+0

此外,我得到了'TypeError:'ApplyResult'對象不可迭代'。 –

+0

可能是因爲[文檔](https://docs.python.org/2/library/multiprocessing.html#multiprocessing.pool.multiprocessing.Pool.apply)指出「func只在其中一個工作人員池「,所以它不會將函數映射到所有的塊,它只是啓動一個進程。 –