Il modo migliore per importare un modulo di grandi dimensioni da utilizzare in diversi moduli

0

Ho un modulo python dataProcessor.py che inizializza una grande quantità di dati in memoria (circa 3 GB) Voglio usare questo modulo in diversi processi che sono in esecuzione simultaneamente.

Ma il problema è che non c'è abbastanza memoria sulla macchina per eseguire tutto allo stesso tempo a causa di dataProcessor.py che carica i dati in memoria per ogni processo (3 GB per ogni processo, quindi per 3 processi un totale di 9 GB di memoria).

Ho provato a utilizzare il modello client-server per inizializzare i dati solo una volta e per servire tutti i processi, ma questo modello è troppo lento. Esiste un metodo per caricare i dati solo una volta e avere altri processi che accedono ai metodi nel modulo dataProcessor.py

Il modulo di cui sto parlando è Spacy che è scritto in Cython. I dati possono essere qualsiasi oggetto Python e non cambieranno una volta scritti. Va bene se la soluzione è un'estensione C per Python.

Esiste un'alternativa al modello server-client o di sottoprocesso che condivide la memoria.

    
posta Harwee 22.01.2017 - 14:16
fonte

2 risposte

1

Innanzitutto, se possibile, inserisci l'inizializzazione dei dati in una funzione (quindi l'inizializzazione non si verificherà all'importazione). Questo aiuta con i test ecc.

Puoi utilizzare multiprocessing.sharedctypes per creare variabili condivise tra più processi , supponendo che stiate biforcandosi in più processi (e non creando più thread). È quindi possibile passare queste variabili condivise ai processi biforcati.

Esempio:

from ctypes import c_double
from multiprocessing.sharedctypes import Array, Pool

arr = Array(c_double, 402653184)  # 3 GB array
arr[0] = 1.0
arr[1] = 2.0
...

def fn(in_arr, j):
    print(in_arr[j])

with Pool() as p:
    p.apply_async(fn, (arr, 0))
    p.apply_async(fn, (arr, 1))
    p.apply_async(fn, (arr, 2))
    p.join()
    
risposta data 01.09.2017 - 14:00
fonte
0

Nascondere il modulo dietro un'API ed eseguirlo come server. Crea un'istanza del server che implementa questa API una sola volta e fai in modo che tutte le comunicazioni da e verso questo modulo passino attraverso l'API e il server. Puoi utilizzare IPC o direttamente un'API di resto, non importa davvero.

Detto questo, non è davvero la soluzione rapida e facile al problema, ma dovrebbe fare il lavoro.

    
risposta data 23.01.2017 - 20:34
fonte

Leggi altre domande sui tag