Pythons Multiprozessing und Speicher

ich benutzemultiprocessing.imap_unordered So führen Sie eine Berechnung für eine Liste von Werten durch:

def process_parallel(fnc, some_list):
    pool = multiprocessing.Pool()
    for result in pool.imap_unordered(fnc, some_list):
        for x in result:
            yield x
    pool.terminate()

Jeder Anruf anfnc gibt als Ergebnis ein großes Objekt von Entwurf zurück. Ich kann N Instanzen eines solchen Objekts im RAM speichern, wobei N ~ cpu_count, aber nicht viel mehr (nicht Hunderte).

Jetzt belegt die Verwendung dieser Funktion zu viel Speicher. Die Erinnerung wird vollständig im Hauptprozess ausgegeben, nicht in den Arbeitern.

Wie geht das?imap_unordered Speichern Sie die fertigen Ergebnisse? Ich meine die Ergebnisse, die bereits von den Arbeitern zurückgegeben, aber noch nicht an den Benutzer weitergegeben wurden. Ich fand es klug und rechnete sie nur "träge" nach Bedarf, aber anscheinend nicht.

Es sieht so aus, als ob ich die Ergebnisse von nicht konsumieren kannprocess_parallel schnell genug, hält der Pool diese riesigen Objekte aus der Warteschlangefnc Irgendwo im Inneren und dann in die Luft gejagt. Gibt es eine Möglichkeit, dies zu vermeiden? Irgendwie die interne Warteschlange einschränken?

Ich benutze Python2.7. Prost.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage