Python-Multiprozessorspeicherauslastung

Ich habe ein Programm geschrieben, das sich wie folgt zusammenfassen lässt:

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()

Der wahre Code (insbesonderewriteOutput()) ist viel komplizierter.writeOutput() Verwendet nur diese Werte, die als Argumente verwendet werden (dh, es wird nicht referenziert)data)

Grundsätzlich lädt es einen riesigen Datensatz in den Speicher und verarbeitet ihn. Das Schreiben der Ausgabe wird an einen Unterprozess delegiert (es wird tatsächlich in mehrere Dateien geschrieben, was viel Zeit in Anspruch nimmt). Jedes Mal, wenn ein Datenelement verarbeitet wird, wird es an den Unterprozess durch res_queue gesendet, der das Ergebnis nach Bedarf in Dateien schreibt.

Der Unterprozess muss nicht auf die von geladenen Daten zugreifen, diese lesen oder ändernloadHugeData() in irgendeiner Weise. Der Unterprozess muss nur das verwenden, was der Hauptprozess durchläuftres_queue. Und das führt mich zu meinem Problem und meiner Frage.

Es scheint mir, dass der Unterprozess eine Kopie des riesigen Datensatzes erhält (wenn die Speichernutzung mit überprüft wird)top). Ist das wahr? Und wenn ja, wie kann ich ID vermeiden (im Wesentlichen mit doppeltem Speicher)?

Ich benutze Python 2.6 und das Programm läuft unter Linux.

Antworten auf die Frage(1)

Ihre Antwort auf die Frage