Utilisation de tableaux Numpy dans la mémoire partagée pour le multitraitement
L'utilisation de la mémoire partagée pour les tableaux numpy est courante dans les scénarios de multitraitement. Cependant, exploiter tout leur potentiel en tant que tableaux numpy, plutôt que simplement en tant que tableaux ctypes, peut être un défi.
La solution réside dans l'exploitation de mp.Array() à partir du module multitraitement. Cette fonction permet la création de tableaux partagés accessibles par plusieurs processus simultanément. Pour accéder à ces tableaux en tant que tableaux numpy, vous pouvez utiliser numpy.frombuffer(), sans encourir de surcharge de copie de données.
Exemple :
import multiprocessing as mp import numpy as np def f(shared_arr): arr = np.frombuffer(shared_arr.get_obj()) arr[:] = -arr[:] if __name__ == '__main__': N = 10 shared_arr = mp.Array(ctypes.c_double, N) arr = np.frombuffer(shared_arr.get_obj()) # Create, start, and finish child processes p = mp.Process(target=f, args=(shared_arr,)) p.start() p.join()
Dans cet exemple , la fonction f() utilise un tableau partagé pour effectuer une négation élément par élément. En accédant au tableau en tant que tableau numpy, vous avez accès à toutes ses opérations et méthodes puissantes.
Synchronisation :
Lorsque plusieurs processus accèdent au même tableau partagé, la synchronisation est crucial pour prévenir les conflits. mp.Array() fournit une méthode get_lock() qui vous permet de synchroniser l'accès selon vos besoins.
# ... def f(i): with shared_arr.get_lock(): # synchronize access arr = np.frombuffer(shared_arr.get_obj()) arr[i] = -arr[i]
En utilisant cette approche, vous pouvez partager des tableaux numpy dans des environnements multitraitements tout en conservant toutes leurs fonctionnalités en tant que tableaux numpy.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!