Bienvenue sur IndexError.

Ici vous pouvez poser des questions sur Python et le Framework Django.

Mais aussi sur les technos front comme React, Angular, Typescript et Javascript en général.

Consultez la FAQ pour améliorer vos chances d'avoir des réponses à vos questions.

Multiprocessing : partager un dico entre les process [fermés]

+4 votes

J'utilise le module multiprocessing avec notamment la classe Pool et la fonction map() pour lancer plusieurs jobs.
Ces jobs utilisent tous un gros dictionnaire (entre 3 et 4 Go). je voudrais savoir s'il était possible de partager ce dico entre les différents sous process, sans le copier en mémoire.
Je précise que les sous process doivent juste lire le dico, mais ne le modifie pas.

procsNb = 3
jobs = [["job1", [args]], ["job2", [args]], ["job3", [args]]]
pool = mp.Pool(processes==procsNb)
results = pool.map(func, jobs)
fermée avec la mention: Question résolue. Même si pas universelle.
demandé 24-Avr-2015 par nicaso (138 points)
fermés 30-Avr-2015 par nicaso

Si le dictionnaire n'est pas modifié, ce n'est pas un problème, si ?

La dernière fois que j'avais voulu faire un truc comme ça, j'avais exposé mon dico via PyRO. Il y aura cependnat une perte de perfs par rapport à un mutiprocessing.Manager.

Sinon, redis/mongo.

Pour montrer que tu as trouvé la solution au problème, il ne faut pas fermer la question, mais accepter une réponse (clic sur le gros signe check pour le faire devenir vert). Si tu as pas de réponse aceptable, écrit ta solution, et je la marquerai comme accepter.

3 Réponses

0 votes
 
Meilleure réponse

Bon, j'avais pas la possibilité d'utiliser des dépendances.
Le copy-on-write ne marche pas non plus à cause du "reference counting". Le dico était dupliqué en mémoire pour chacun des sous process.
Finalement j'ai pu utilisé une solution qui marche pour mon type de données, mais qui ne sera pas fonctionnelle pour tout le monde. Mes dico contenaient en valeur des listes d'entiers. J'ai donc pu utiliser multiprocessing.sharedctypes.RawArray(), qui me permet donc d’accéder à mes array à partir des différents sous process.

répondu 28-Avr-2015 par nicaso (138 points)
sélectionné 11-Avr-2016 par foxmask

Si tu penses que t'as eu / trouvé la réponse à la question initiale, passe le post en résolu =D

+2 votes

C'est peut être excessif de rajouter des dépendances, mais j'ai l'impression que ce serait facile à faire avec redis (voir ici ou ), non ?

répondu 24-Avr-2015 par bubulle (2,104 points)
+2 votes

Et pourquoi pas un lock sur les écritures du dictionnaire en question ?

Voilà un exemple de décorateur qui pourrait faire l'affaire :

def synchronized(lock=None):
    """
    Décorateur permettant de verrouiller l'accès simultané à une méthode
    :param lock: Verrou externe partagé
    :return: Decorateur
    """
    def decorator(func):
        func.__lock__ = lock or threading.Lock()
        @wraps(func)
        def wrapped(*args, **kwargs):
            with func.__lock__:
                return func(*args, **kwargs)
        return wrapped
    return decorator
répondu 28-Avr-2015 par debnet (1,002 points)
...