Les grands Pandas Dataframe de traitement parallèle
Je suis d'accéder à un très grand Pandas dataframe comme une variable globale. Cette variable est accessible en parallèle via joblib.
Par exemple.
df = db.query("select id, a_lot_of_data from table")
def process(id):
temp_df = df.loc[id]
temp_df.apply(another_function)
Parallel(n_jobs=8)(delayed(process)(id) for id in df['id'].to_list())
Accès à l'original de la df de cette manière semble copier les données entre processus. C'est inattendu, car l'original de la df n'est pas altérée dans l'un des sous-processus? (ou est-il?)
OriginalL'auteur autodidacticon | 2015-11-09
Vous devez vous connecter pour publier un commentaire.
L'ensemble du DataFrame doit être nettoyée et unpickled pour chaque processus créé par joblib. Dans la pratique, c'est très lente et nécessite de nombreuses fois la mémoire de chacun.
Une solution est de stocker vos données en HDF (
df.to_hdf
) en utilisant le format de tableau. Vous pouvez ensuite utiliserselect
pour sélectionner des sous-ensembles de données pour un traitement ultérieur. Dans la pratique, ce sera trop lent pour une utilisation interactive. Il est aussi très complexe, et votre les travailleurs ont besoin de stocker leur travail de sorte qu'il peut être consolidés dans l'étape finale.Une alternative serait d'explorer les
numba.vectorize
avectarget='parallel'
. Cela nécessiterait l'utilisation de tableaux NumPy pas Pandas objets, de sorte qu'il a aussi une certaine complexité coûts.Dans le long terme, dask espère apporter de l'exécution en parallèle des Pandas, mais ce n'est pas quelque chose à espérer bientôt.
Seul un petit nombre de types peuvent être transmis à l'aide de la mémoire partagée. Les Pandas objets ne sont pas dans cette liste. joblib gère automatiquement la mémoire de partage pour les tableaux numpy en fonction de la taille de la matrice à l'aide de l'argument mot-clé
max_nbytes
lors de l'invocation deParallel
. Voir joblib du site. Voir aussi cette réponse. Vous pouvez bien sûr utiliser des tableaux NumPy en place des Pandas et vous pouvez voir beaucoup plus rapides.OriginalL'auteur Kevin S
Python multitraitement est généralement réalisé à l'aide de processus distincts, comme vous l'avez remarqué, ce qui signifie que le processus ne partagent pas de mémoire. Il y a un potentiel de solution de contournement si vous pouvez obtenir les choses à travailler avec
np.memmap
comme mentionné un peu plus loin sur la joblib docs, bien que le dumping sur le disque sera bien évidemment ajouter des frais généraux de son propre: https://pythonhosted.org/joblib/parallel.html#working-with-numerical-data-in-shared-memory-memmapingOriginalL'auteur Randy