我正在尝试使用multiprocessing
修改JSON文件。我可以将JSON拆分为块,这样每个进程只能访问和修改JSON的某个部分(因此可以保证没有两个进程想要修改相同的属性)。我的问题是,如何在进程之间共享JSON对象,以便更改反映在原始对象上?我知道,multiprocessing
将对象作为副本传递,因此我需要使用Manager()
,但我该怎么做呢?目前我有
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 :(得分:-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)