Uso de memória de multiprocessamento Python
Escrevi um programa que pode ser resumido da seguinte forma:
def loadHugeData():
#load it
return data
def processHugeData(data, res_queue):
for item in data:
#process it
res_queue.put(result)
res_queue.put("END")
def writeOutput(outFile, res_queue):
with open(outFile, 'w') as f
res=res_queue.get()
while res!='END':
f.write(res)
res=res_queue.get()
res_queue = multiprocessing.Queue()
if __name__ == '__main__':
data=loadHugeData()
p = multiprocessing.Process(target=writeOutput, args=(outFile, res_queue))
p.start()
processHugeData(data, res_queue)
p.join()
O código real (especialmentewriteOutput()
) é muito mais complicado.writeOutput()
usa apenas esses valores que toma como seus argumentos (o que significa que não faz referênciadata
)
Basicamente, ele carrega um enorme conjunto de dados na memória e o processa. A gravação da saída é delegada a um subprocesso (ela grava em vários arquivos, e isso leva muito tempo). Assim, cada vez que um item de dados é processado, ele é enviado para o subprocesso por res_queue, que, por sua vez, grava o resultado em arquivos, conforme necessário.
O subprocesso não precisa acessar, ler ou modificar os dados carregados peloloadHugeData()
de qualquer forma. O subprocesso só precisa usar o que o processo principal enviares_queue
. E isso me leva ao meu problema e pergunta.
Parece-me que o subprocesso obtém a cópia do enorme conjunto de dados (ao verificar o uso da memória comtop
). Isso é verdade? E se sim, então como posso evitar id (usando essencialmente a memória dupla)?
Eu estou usando o Python 2.6 e o programa está rodando no linux.