Wie kann ich ein großes CustomObject für Worker in Python-Multiprocessing unter Windows (Spawn) freigeben?Python

Python-Programme
Anonymous
 Wie kann ich ein großes CustomObject für Worker in Python-Multiprocessing unter Windows (Spawn) freigeben?

Post by Anonymous »

Ich versuche, Berechnungen mit mehreren Kernen in Python auf mehreren Plattformen (Linux, macOS, Windows) auszuführen. Ich muss ein großes CustomClass-Objekt und ein dict (beide schreibgeschützt) an alle Arbeiter übergeben. Bisher habe ich versucht, Multiprocessing mit Pool zu verwenden. Auf Plattformen, die Fork verwenden (Linux, macOS), führt dies zu einer schnelleren Berechnung. Unter Windows (Spawn) ist die Multiverarbeitung viel langsamer und speicherineffizient. Unter Windows werden Prozesse nacheinander erzeugt, was viel länger dauert als die eigentliche Berechnung.

Code: Select all

import multiprocessing as mp
import numpy as np
import tqdm

class CustomClass:
def __init(self, data):
## assigns multiple huge vectors and objects

class ParallelComputation:
...
def compute(n_jobs=-1):
custom_obj = CustomCLass(data) # ~1GB of memory
cfg = dict(some_config=True)
inputs = [(1, np.random.rand(1, 300)), (1, np.random.rand(1, 300)), ...] # array of tuples
worker = worker_task

with mp.Pool(processes=n_jobs, initializer=_set_globals, initargs=(custom_obj, cfg)) as pool:
for result in tqdm(pool.imap(worker, inputs, chunksize=8), total=n_rows):
i, row = result
out[i, :] = row
...

def worker_task(args):
lib = _G_LIB
cfg = _G_CFG
# some computation

def _set_globals(custom_obj, cfg):
global _G_LIB, _G_CFG
_G_LIB = custom_obj
_G_CFG = cfg
Wenn ich meine Berechnung ausführe, muss ich sie auch unter Windows schützen:

Code: Select all

if __name__ == "__main__":
parallel = ParallelComputation(...)
parallel.compute()
Ich habe auch joblib ausprobiert, das Arbeitsprozesse parallel erzeugt, aber auch viel Speicher verbraucht. Ich ändere das custom_obj oder cfg nicht, daher scheinen SharedMemory oder ein ProcessManager nicht geeignet zu sein.
Wie kann ich Multiprocessing mit einem großen CustomClass-Objekt unter Windows effizient nutzen?

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post