Hier, j'ai posé une question: Reading data in parallel with multiprocessRemplir un dictionnaire en parallèle avec multitraitement
Je suis très bonnes réponses, et j'implémenté la solution mentionnée dans la réponse que je marqué comme correct.
def read_energies(motif):
os.chdir("blabla/working_directory")
complx_ener = pd.DataFrame()
# complex function to fill that dataframe
lig_ener = pd.DataFrame()
# complex function to fill that dataframe
return motif, complx_ener, lig_ener
COMPLEX_ENERGIS = {}
LIGAND_ENERGIES = {}
p = multiprocessing.Pool(processes=CPU)
for x in p.imap_unordered(read_energies, peptide_kd.keys()):
COMPLEX_ENERGIS[x[0]] = x[1]
LIGAND_ENERGIES[x[0]] = x[2]
Cependant, cette solution prend la même quantité de temps que si je voudrais juste itérer sur peptide_kd.keys()
et remplir le DataFrames
un par un. Pourquoi est-ce si? Y a-t-il un moyen de remplir les dicts désirés en parallèle et d'obtenir une augmentation de vitesse? Je l'utilise sur un HPC 48 core.
Il se peut que le surcoût lié à l'utilisation du multitraitement soit supérieur à celui du traitement de la fonction complexe. Peut-être que le fait d'avoir 'read_energies()' traiter un dataframe à nombre variable à chaque fois vous permettrait de régler les choses au point où cela deviendrait avantageux. – martineau